Ruby on rails 接受\u嵌套的\u属性\u,如果和有一个关系不在一起,则拒绝\u?

Ruby on rails 接受\u嵌套的\u属性\u,如果和有一个关系不在一起,则拒绝\u?,ruby-on-rails,activerecord,ruby-on-rails-3.2,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(我使用调试器检查了它),但嵌套顺序并没有被破坏 互联网上有很多关于这一现象的文章,但我找不到解决办法 有人知道怎么

在我的模型中,我有

has_one :order, dependent: :destroy

accepts_nested_attributes_for :order, reject_if: lambda { |order| order[:description].blank? }, allow_destroy: true
出于某种原因,尽管测试了reject_if并返回true(我使用调试器检查了它),但嵌套顺序并没有被破坏

互联网上有很多关于这一现象的文章,但我找不到解决办法

有人知道怎么解决这个问题吗

试试这个

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

我最终创建了一个智能的“reject_if”,在这个特定场合设置销毁标志,如中所述,但是,按照我自己的标准,这不是非常“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)
}

从嵌套的_属性

您还可以将:reject_if proc设置为在任何新记录哈希未能通过您的条件时自动忽略它们

任何具有空白
说明的哈希将被完全忽略,即使它具有
\u destroy
标志

如果您想删除带有空白描述的记录,我可以想出两种解决方案

选项1:在您的模型上通过回调删除它们:

before_save :remove_orders_without_description

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

选项2:删除模型定义中的
reject\u if
选项,并在视图中使用JS适当设置
\u delete
属性

销毁后,模型是否触发
回调?如果是这样,您可以在该回调中销毁相关的
顺序
!这不是
接受
的嵌套属性的工作方式。如果模型具有
说明
,则您的代码允许模型设置/更新
订单
关系。如果设置了
\u destroy
属性,它还允许销毁
订单
。根据,如果您试图破坏
订单
关系,it将忽略
拒绝\u。转到您的代码:您是否尝试在
订单
模型中设置
验证:description
的存在?我不明白:对于很多人来说,这和我现在使用的一样有效,但是对于have\u one来说,这不起作用?has_one不被视为“has至多一个”?您的
订单
型号是什么样子的?尝试过这个,但不起作用。。。我最终构建了一个“有效”的东西,但根据我的说法,它不是很红宝石:看看我自己的答案!然后我更喜欢使用我自己的答案中描述的非ruby方式。。。就我个人而言,之前的保存在这个过程中太晚了……没有关于这个主题的新闻?在2018年,我仍然有同样的问题,比如
has\u one
before_save :remove_orders_without_description

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