首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含嵌套记录的mark_for_destruction

包含嵌套记录的mark_for_destruction
EN

Stack Overflow用户
提问于 2012-12-23 02:37:24
回答 1查看 1.7K关注 0票数 1

在我的应用程序中,我使用mark_for_destruction根据条件删除嵌套记录。

我有一个Ticket模型和一个Pick模型:

代码语言:javascript
复制
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)之后的所有其他挑库。如果我编辑记录,它可以正常工作,但不能在创建新记录时工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-24 07:12:00

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

也就是说,一种更简单的方法可能是使用accepts_nested_attributes_for的reject_if选项:

代码语言:javascript
复制
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链接来允许这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14005480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档