次のクラスがあるとします
class Foo < ActiveRecord::Base
attr_accessible :name, :bars, :bazs
def bars=(bars)
baz = []
bars.each { |b| barz << Baz.new(bar:b, magic_number: 123) }
end
def bars
bazs.map(&:bar)
end
end
class Bar < ActiveRecord::Base
attr_accesible :name
end
class Baz < ActiveRecord::Base
attr_accesible :magic_number, :bar
has_one :bar
end
これは、初期化メソッドを宣言する「レール」の方法であるため、ハッシュから Foo が作成されると、baz が初期化されます。例えば
Foo.new(name:"foo", bars:[Bar.new(name:"b1"), Bar.new(name:"b2")])
nil を返すafter_initialize
ため使用できません。self[:bars]
もう 1 つのオプションはメソッドを上書きするinitialize
ことですが、Rails のドキュメントでは推奨されておらずbarz=
、初期化barz
が返された後nil
に を使用する必要があるため、使用できませんself[:barz]=
。もう 1 つのオプションは、セッターを呼び出すことによって適切な初期化を行うクラス コンストラクター メソッドを宣言することですが、それは Ruby の方法ではないようです ( Foo.from(name:"foo", bars:[Bar.new(name:"b1"), Bar.new(name:"b2")])
)。
ありがとう