2

これは例によって最もよく説明されます。以下は簡単です。

class Foo < ActiveRecord::Base
  has_many :bars
end

1a>> foo = Foo.new
=> #<Foo id: nil>
2a>> foo.bars << Bar.new
=> [#<Bar id: nil, foo_id: nil>]
3a>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]

ただし、2行目を明示的に実行せずにすべてのFooオブジェクトをBarで初期化する必要があります。

class Foo < ActiveRecord::Base
  has_many :bars

  # [...] Some code here
end

1b>> foo = Foo.new
=> #<Foo id: nil>
2b>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]

これは可能ですか?理想的には、「デフォルト」オブジェクトは、2a行目を明示的に実行する場合と同じ方法で関連付けられるため、親Fooオブジェクトが保存されるときに保存されます。

4

2 に答える 2

2

序文として、デザインの観点からは、これはおそらく最高のアイデアではないということを述べさせてください。コードが Foo や Bar よりもはるかに複雑であると仮定すると、ビルダーの方針に沿った何かに向かっている可能性があります。

ただし、要求したことを実行することを主張する場合は、これで実行されます。

class Foo < ActiveRecord::Base
  has_many :bars

  def after_initialize 
    self.bars << Bar.new if self.new_record?
  end 
end
于 2010-07-05T16:59:11.560 に答える
1

概念上、これはこのようなことを行うための最もクリーンな方法ではありません。モデル ロジックを別のロジック内に混在させているからです。

さらに: 初期化中にまだインスタンスがないため、これは不可能だと思います。

関連するオブジェクトを保存する必要がある場合は、コントローラーで行うか、ネストされたモデル フォームを使用して行うことができることに注意してください。

あなたが達成する必要があるタスクは何ですか?

于 2010-07-05T16:51:56.657 に答える