Ruby on rails 接受\u嵌套的\u属性\u用于:销毁数组中未包含的所有属性
是否有一种干净的方法来销毁传递的嵌套属性数组中未包含的所有子级? 现在我必须找出实际子数组和嵌套属性数组之间的差异,然后设置_destroy:true,但看起来很难看Ruby on rails 接受\u嵌套的\u属性\u用于:销毁数组中未包含的所有属性,ruby-on-rails,nested-attributes,Ruby On Rails,Nested Attributes,是否有一种干净的方法来销毁传递的嵌套属性数组中未包含的所有子级? 现在我必须找出实际子数组和嵌套属性数组之间的差异,然后设置_destroy:true,但看起来很难看 class Report < ActiveRecord::Base has_many :consumed_products accepts_nested_attributes_for :consumed_products, allow_destroy: true def nested_attributes_de
class Report < ActiveRecord::Base
has_many :consumed_products
accepts_nested_attributes_for :consumed_products, allow_destroy: true
def nested_attributes_destroy_difference(attrs)
combined = attrs.reduce({}) {|h,pairs| pairs.each {|k,v| (h[k] ||= []) << v}; h}
diff = consumed_products - consumed_products.where(combined)
attrs + diff.map{|i| {id: i.id, _destroy: true} }
end
end
class Api::V2::ReportsController < Api::V2::BaseController
def update
report = Report.find(params[:id])
report_attributes = report_params
if params[:consumed_products]
report_attributes.merge!(consumed_products_attributes: report.nested_attributes_destroy_difference(consumed_products_attributes))
end
report.assign_attributes report_attributes
end
private
def consumed_products_attributes
params[:consumed_products].map do |p|
{product_id: p[:id], product_measure_id: p[:measure_id], quantity: p[:quantity]}
end
end
def report_params
#...
end
end
类报告 combined=attrs.reduce({}){| h,pairs | pairs.each{| k,v |(h[k]|=[]))当你像这样添加允许销毁:真
时会发生什么为消费的产品接受嵌套的属性,允许销毁:真
?是的,我在帖子中忘记了。没有允许销毁:真
就无法使用销毁:真
销毁孩子,但要真正销毁任何孩子,你必须添加销毁oy:true
对于你需要销毁的每个孩子,你需要在销毁之前找到他们,我想接受调用的collection=
的嵌套属性,这会自动完成吗?@japed是的,会,但如果我想更新一些孩子?报告。消费的产品=参数[:消费的产品]。映射{| i | Report::ConsumedProduct.find_或_initialize_by(i)}
-类似这样的操作会为每个更新的子级创建新记录并销毁旧记录,有时可以,但不一定。