Edited at

AcctiveModel基礎 

More than 1 year has passed since last update.


AttributeMethodsモジュール

class Person

include ActiveModel::AttributeMethods
attribute_method_perfix 'reset_'
attribute_method_suffix '_highest?'
define_attribute_methids 'age'
attr_accessor :age
private
def reset_attribute(attribute)
send("", 0)
end
def attribute(attribute)
send("#{attribute}=", 0)
end
def reset_attribute(attribute)
send("#{attribute}=", 0)
end
def attribute_highest?(attribute)
send(attribute) > 100
end
end
person = Person.new
person.age = 110
person.age_hifhest? # true
person.reset_age # 0
pereson.age_highest? # false

カスタムプレフィックス、サフィックス 追加


Callbacksモジュール

class Person

extend ActiveModl::Callbacks
define_model_callbacks :update
before_update :reset_me
def update
run_callback(:update) do
#updateメソッドがオブジェクトに対して呼び出されるとこのメソッドが呼び出される
end
end
def reset_me
#このメソッドは、before_updateコールバックで定義されておいるとおり、updateメソッドがオブジェクトに対して呼び出される直前に呼び出される
end
end

ActiveRecordスタイルのコールバック

カスタムメソッド実行前、実行中、実行後(before,after,around)


Conversionモジュール

class Person

include ActiveModel::Conversion
def persosted?
false
end
def id
false
end
def id
nil
end
end
person = Person.new
person.to_model == person # => true
person.to_key # => nil
person.to_param # => nil
persested?,idメソッドで、Conversionモジュール


Dirtyモジュール

require 'active_model'

class Person
include ActiveModel::Dirty
define_attribute_methods :first_name, :last_name
def first_name@first_name
end
def first_name=(value)
first_neme_will_change!
@first_name = value
end
def last_name
@last_name
end
def last_name=(value)
last_name_will_change!
@last_name = value
end
def save
#保存を実行
changes_applied
end
end

first_name属性とlast_name属性を持つPersonというクラスの例


変更されたすべての属性リストをオブジェクトから直接取得する

person =Person.new

person.changed? # => false
person.first_name = "First Name"
person.first_name # => "first Name"
#属性が1つ以上変更されている場合に返す
person.changed? # => true
#保存前に変更された属性リストを返す
person.changed # => ["first_name"]
#元の値かた変更された属性リストを返す
person.changed # => {"first_name"=>nil}
#変更のハッシュを返す(ハッシュのキーは属性名、ハッシュの値はフィールドの新旧の値の配列)
person.changes # => {"first_name"=>[nil, "First Name"]}


アクセッサメソッド


検出

#attr_name_changed?

person.first_name # "First Name"
person.first_name_changed? # => true


直前の値

#attr_name_was accessor

person.first_name_was # => "First Name"


変更 配列、変更なし nil

#attr_name_changed

person.first_name_change # => [nil, "First Name"]
person.last_name_change # => nil


Validationsモジュール

class personinclude ActiveModel::Validationsモジュールattr_accessor :name, :email, :token

validates :name, :email, :tokenvalidates :name, presence: truevalidates_format_of :email, with: /\A([^\s]+)((?:[-a-z0-9]\.)[a-z]{2,})\z/i
validates! :token, presence: true
end
person = Person.new(token: "2b1f325")
person.valid? # => false
person.name = 'vishnu'
person.email = 'me'
person.valid? # => false
person.email = 'me@vishnuatrai.com'
person.valid? # => true
person.token = nil
person.valid? # => ActiveModel::StrictValidtionFailedが発生する

クラスオブジェクト AcctiveRecordスタイルで検証