0

has_many throughでイライラする問題が発生しています。つまり、throughモデルは保存するまで作成されないという事実です。残念ながら、親を保存する前に、これらのモデルにデータを設定する必要があります。

緩い設定は次のとおりです。

class Wtf < ActiveRecord::Base
  belongs_to :foo
  belongs_to :bar
end

class Bar < ActiveRecord::Base
  has_many :wtfs
  has_many :foos, :through => :wtfs
end


class Foo < ActiveRecord::Base
  has_many :wtfs
  has_many :bars, :through => :wtfs

  def after_initialize
    Bar.all.each do |bar|
      bars << bar
    end
  end

end

保存する前に「wtf」にアクセスする必要があることを除いて、すべて問題ありません。

f = Foo.new =>#

f.bars=>[バーのリスト]

ここに空のリスト

f.wtfs => []

f.save!=>真

今私はものを手に入れます

f.wtfs=>[もののリスト]

私はこれを行うwtfsを明示的に作成することさえしました:

 def after_initialize
    Bar.all.each do |bar|
      wtfs << Wtf.new( :foo => self, :bar => bar, :data_i_need_to_set => 10)
    end
  end

これにより、f.wtfsは入力されますが、バーは入力されません。保存して取得すると、予想されるwtfsの2倍になります。

誰かアイデアはありますか?

4

3 に答える 3

2

直接作成するのは正しい考えだと思いますWtfs。同時にバーを設定すればOKになると思います。

def after_initialize
  Bar.all.each do |bar|
    wtfs << Wtf.new(:bar => bar, :data_i_need_to_set => 10)  # Rails should auto-assign :foo => self
    bars << bar
  end
end

Railsは同じオブジェクトのコレクションであるため、レコードを正しく保存する必要があります。Bar唯一のドラッグは、barsコレクションの新しいレコードにすでにWtf関連付けられているかどうかをチェックするためのスマートがレールにない場合、とにかくそれを作成する可能性があることです。やってみよう。

于 2010-05-13T21:31:20.170 に答える
1

次のように、バーにデータを入力するメソッドをafter_createに設定できます。

class Foo < ActiveRecord::Base
  has_many :wtfs
  has_many :bars, :through => :wtfs
  after_create :associate_bars

  def associate_bars
    Bar.all.each do |bar|
      bars << bar
    end
  end
end

これにより、このメソッドが呼び出されたときにwtfsがすでに作成されます。

于 2010-05-13T21:08:46.917 に答える
1

before_save設定する必要のあるデータを設定するハンドラーをWtfに記述できませんでしたか?必要に応じて、fooとbarの両方にアクセスできます。

于 2010-05-13T20:47:15.880 に答える