在我的应用程序中,我使用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为true)之后的所有其他挑库。如果我编辑记录,它可以正常工作,但不能在创建新记录时工作。
发布于 2013-02-24 07:12:00
在我看来,rails 3.2.3中有一个bug --我在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的所有新拾取。它唯一没有解决的是更新情况,如果您希望现有的pick在更新为权重为0时被删除,但您有一个remove pick链接来允许这样做。
https://stackoverflow.com/questions/14005480
复制相似问题