0

私は以下のモデルを持っています:

class Foo < ActiveRecord::Base
    has_many :bars
end

class Bar < ActiveRecord::Base
    belongs_to :foo
end

ビジネス ロジックでは、オブジェクトを初期化するときにfoo f = Foo.new3 つのバーも初期化する必要があります。これどうやってするの?

4

3 に答える 3

4

after_create( を呼び出した後)Foo.createまたはafter_initialize( を呼び出した後Foo.new) をFoo.rb

after_create :create_bars

def create_bars 
  3.times  do
   self.bars.create!({})
  end
end

または:

after_initialize :create_bars

def create_bars 
  3.times  do
   self.bars.new({})
  end if new_record?
end
于 2013-08-14T13:22:45.063 に答える
3

あなたはできる:

  • Bar インスタンスを初期化する after_initialize コールバックを設定する
  • has_many アソシエーションに追加の :autosave オプションを設定して、親 foo を保存するときに子 Bar インスタンスが確実に保存されるようにします

コードは次のようになります。

class Foo < ActiveRecord::Base
  has_many :bars, autosave: true

  after_initialize :init_bars

  def init_bars
    # you only wish to add bars on the newly instantiated Foo instances
    if new_record?
      3.times { bars.build }
    end
  end

end

親の Foo インスタンスを破棄するときに Bar インスタンスを破棄したい場合は、オプションdependent: :destroy を追加できます。

于 2013-08-14T13:35:56.243 に答える