accepts_nested_attributes_for,reject_if和has_one关系不能一起工作?

时间:2014-03-15 13:57:00

标签: ruby-on-rails activerecord ruby-on-rails-3.2

在我的模特中我有

has_one :order, dependent: :destroy

accepts_nested_attributes_for :order, reject_if: lambda { |order| order[:description].blank? }, allow_destroy: true

出于某种原因,尽管reject_if已经过测试并返回true(我使用调试器检查过),但嵌套顺序不会被销毁。

互联网上有很多关于这种现象的文章,但我找不到解决方案。

有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

我终于创造了一个聪明的" reject_if"如Destroy on blank nested attribute所述,在这个特定场合设置销毁旗帜,但是,根据我自己的规范,这不是很好的" ruby​​",所以无法想象没有更好的解决方案...

accepts_nested_attributes_for :order, allow_destroy: true, reject_if: lambda { |attributes|
  exists = attributes['id'].present?
  empty = attributes[:description].blank?
  attributes.merge!({_destroy: 1}) if exists and empty
  return (!exists and empty)
}

答案 1 :(得分:1)

来自nested_attributes API

  

如果无法通过您的条件,您也可以设置:reject_if proc以静默忽略任何新的记录哈希值。

params = { member: {
  name: 'joe', order_attributes: [
    { description: 'Kari, the awesome Ruby documentation browser!' },
    { description: 'The egalitarian assumption of the modern citizen' },
    { description: '', _destroy: '1' } # this will be ignored
  ]
}}

任何具有空白description的哈希都将被完全忽略,即使它具有_destroy标志。

如果你想删除带有空白描述的记录,我可以想到两个解决方案

选项1:在您的模型中使用回调删除它们:

before_save :remove_orders_without_description

def remove_orders_without_description
  orders.select{|o| o.description.blank?}.each(&:delete)
end

选项2:删除模型定义中的reject_if选项,并在视图中使用JS来适当设置_delete属性

答案 2 :(得分:0)

试试这个

accepts_nested_attributes_for :order, reject_if: lambda { |order| order[:_destroy].blank? && order[:description].blank? }, allow_destroy: true