带有嵌套记录的mark_for_destruction

时间:2012-12-22 18:37:24

标签: ruby-on-rails ruby nested-attributes before-save

在我的应用程序中,我使用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加权选择(marked_for_destruction为真)后删除所有其他选择。如果我编辑记录但在创建新记录时不起作用,它可以正常工作。

1 个答案:

答案 0 :(得分: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时删除现有选择,但是有一个删除选择链接,无论如何都允许。