تهيئة سمة صحيحة في Rails عندما يتم التفاف سمة بواسطة فئة أخرى

لنفترض أن لدينا الفصول التالية

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 من تجزئة تتم تهيئة bazs. فمثلا

Foo.new(name:"foo", bars:[Bar.new(name:"b1"), Bar.new(name:"b2")])

لا يمكنك استخدام after_initialize لأن self [: bars] تُرجع صفرًا. الخيار الآخر هو الكتابة فوق تهيئة الطريقة ولكن لا نوصي بها وثائق Rails ولا أستطيع استخدام barz = لأنه بعد التهيئة barz يعود لا شيء ، يجب علي استخدام self [: barz] = . سيكون الخيار الآخر هو إعلان أسلوب منشئ الفصل الذي يقوم بالتهيئة المناسبة عن طريق استدعاء أداة الإعداد ، ولكن لا يبدو أنها طريقة ruby ( Foo.from (الاسم: "foo" ، أشرطة: [Bar.new (الاسم: "b1") ، Bar.new (الاسم: "b2")]]) ).

شكر

0
هل attr_accessible: name ،: bars ،: barz ، barz = [] و bars.each {| b | barz << Baz.new (bar: b، magic_number: 123)} ؟
وأضاف المؤلف Wawa Loo, مصدر

1 إجابة

حسناً ، ما فعلته في النهاية هو إعلان كل شيء على أنه attr_accessible وتجاوز طريقة التهيئة

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

One thing to notice that I didn't know was that everytime that I need to called a getter/setter it needs to be done using self.

0
وأضاف