1

関連するコレクションに新しいアイテムを追加すると、結果の変更を確認するために foo.reload を呼び出す必要がないことがわかりました (スクリプト/コンソールでうろついています)。

foo.bars
=> []
foo.bars_attributes = [{ :person_id => '288', :task_id => '1237' }]
=> [{ :person_id=>"288", :task_id=>"1237" }]
foo.save
=> true
foo.bars
=> [#<Bar id: 6, person_id: 288, task_id => 1237>]

素晴らしい。しかし、コレクションからアイテムを削除する場合、コレクションに変更が反映される前に foo.reload を呼び出す必要があります (save の呼び出し後に DB に表示されます)。

foo.bars_attributes = [{ :id => '6', :_delete => '1' }]
= [{ :_delete=>"1", :id=>"6" }]
foo.save
=> true
foo.bars
=> [#<Bar id: 6, person_id: 288, task_id => 1237>]
foo.reload
foo.bars
=> []

これは正常ですか、それとも関連付けの更新で少し間違ったことをしていますか?

4

1 に答える 1

0

Rails 3.0でも同じことが見られます(執筆時点ではまだリリースされていません)。最小限の数の関連付けを必要とする検証で大混乱を招いていました。更新によってすべての子属性が削除された後でも、親インスタンスはそれが有効であると言うでしょう。

次のメソッドを使用してモデルにモジュールを含め、コントローラーのメソッドParentでそれを置き換えることにより、回避策を考案しました。update_attributes()update

  def update_with_association_size_validations(attributes)
    update_successful = false
    self.class.transaction do
      self.update_attributes(attributes)
      self.reload
      update_successful = true if self.valid?
      raise ActiveRecord::Rollback unless update_successful
    end
    update_successful
  end

これは決して完璧な解決策ではなく、より深くネストされた関連付けではテストされていません。

ほぼ1年から1日です。

于 2010-12-21T23:48:51.000 に答える