Ruby on rails 使用嵌套记录标记要销毁的\u

Ruby on rails 使用嵌套记录标记要销毁的\u,ruby-on-rails,ruby,nested-attributes,before-save,Ruby On Rails,Ruby,Nested Attributes,Before Save,在我的应用程序中,我使用mark_for_destruction根据条件删除嵌套记录 我有一张票型号和一张皮卡型号: 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_

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

我有一张
型号和一张
皮卡
型号:

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    
classticket

如果有一张票证有4个与之相关联的选择,其重量
1,0,2,1
;然后,在创建新的记录单记录时,仅保存第一次拾取,并删除
0
加权拾取(对于
标记的要销毁的拾取
为true)之后的所有其他拾取。如果我编辑了该记录,但在创建新记录时不起作用,它可以正常工作。

在我看来,rails 3.2.3中似乎有一个bug-我不认为3.2.12中存在此问题,但我不确定它何时得到修复

也就是说,一种更简单的方法可能是使用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
classticketlambda{| attributes | attributes[:weight]。to_i==0},
:allow_destroy=>true
属性可访问:拾取属性
结束

这将自动拒绝权重为0的所有新拾取。它唯一没有解决的问题是,如果您希望在将现有拾取更新为权重为0时将其删除,但您有一个“删除拾取”链接来实现这一点。

如果您希望快速决策,可以将“保存前”更改为“保存后”过滤器,我想这会有所帮助。是否只拒绝权重为0的拾取,或者你真的想拒绝权重为0的拾取以及之后的所有拾取吗?@cbascom:我只想拒绝权重为0的拾取,但相邻的拾取也会被删除。我还创建了一个小应用程序来说明这个问题:创建一个新的票证记录,其中嵌套的选择分别提供权重属性1、0、4、6。它应该删除第二个选择,因为它的权重为0,其他3个选择应该保存在数据库中。但是,0加权拾取的下一个相邻拾取也会被删除,即仅保存第一个和最后一个拾取的权重为1和6。是的,此错误特定于rails版本。与轨道3.2.12配合良好。你同意我的回答,但你没有接受。这是一个错误,还是您在寻找其他信息?实际上,这是一个奇怪的错误,因为rails版本也没有正确解释。不管怎么说,你的回答也说明了解决办法,所以我会把它标为正确的。