1

私のアプリケーションではmark_for_destruction、条件に基づいてネストされたレコードを削除するために使用しています。

私はTicketモデルとモデルを持っていPickます:

class Ticket < ActiveRecord::Base
  has_many :picks
  accepts_nested_attributes_for :picks
  attr_accessible :picks_attributes

  before_save :mark_destroy_zero_weighted_picks

  def mark_destroy_zero_weighted_picks
    picks.each do |pick|
      pick.mark_for_destruction if pick.weight.to_i == 0
    end
  end
end

class Pick < ActiveRecord::Base
  belongs_to :ticket
  attr_accessible :ticket_id
  attr_accessible :weight
end    

関連付けられた 4 つのピックを持つチケットがあり、重みが1,0,2,1; 次に、最初のピックのみが保存され、新しいチケット レコードを作成するときに、0加重ピック ( true の場合) の後の他のすべてのピックが削除されます。marked_for_destructionレコードを編集すると問題なく動作しますが、新しいレコードの作成中は機能しません。

4

1 に答える 1

2

Rails 3.2.3 にバグがあったようです。3.2.12 ではこの問題は見られませんが、いつ修正されたかはわかりません。

つまり、これにアプローチする簡単な方法は、accepts_nested_attributes_for に reject_if オプションを使用することです。

class Ticket < ActiveRecord::Base
  has_many :picks
  accepts_nested_attributes_for :picks,
    :reject_if => lambda { |attributes| attributes[:weight].to_i == 0 },
    :allow_destroy => true
  attr_accessible :picks_attributes
end

これは、重みが 0 のすべての新しいピックを静かに拒否します。対処しないのは、既存のピックが更新されて重みが 0 になったときに既存のピックを削除する場合の更新のケースだけですが、削除があります。とにかくそれを許可するリンクを選択してください。

于 2013-02-23T23:11:59.947 に答える