0

次のクラスがあるとします

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")]))。

ありがとう

4

1 に答える 1

0

OK私が最終的にやったことは、すべてをattr_accessibleとして宣言し、initializeメソッドをオーバーライドすることでした

class Foo < ActiveRecord::Base
  attr_accessible :name, :bars, :bazs 

  def initialize(attributes = nil, options = {})
    super
    self.bars = attributes[:bars]
  end

  def bars=(bars)
    self.bazs = []
    self.bars.each { |b| self.bazs << Baz.new(bar:b, magic_number: 123) }
  end

  def bars
    self.bazs.map(&:bar)
  end

end

私が知らなかったことに気づくことの1つは、ゲッター/セッターを呼び出す必要があるたびに、それを使用して行う必要があるということでしたself.

于 2012-06-22T15:17:19.853 に答える