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 个选秀权的票与之关联,则有 weight 1,0,2,1;然后在创建新的票证记录时,只有第一个选秀权被保存,加权选秀权之后的所有其他选秀0权(这是真的)被删除。marked_for_destruction如果我编辑记录但在创建新记录时不起作用,它可以正常工作。

4

1 回答 1

2

在我看来,rails 3.2.3 中有一个错误 - 我没有看到 3.2.12 的这个问题,但我不确定它什么时候得到修复。

也就是说,解决这个问题的一种更简单的方法可能是对接受嵌套属性_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 回答