在我的应用程序中,我使用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
为真)后删除所有其他选择。如果我编辑记录但在创建新记录时不起作用,它可以正常工作。
答案 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时删除现有选择,但是有一个删除选择链接,无论如何都允许。