Ruby on rails 接受\u嵌套的\u属性\u用于:销毁数组中未包含的所有属性

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

是否有一种干净的方法来销毁传递的嵌套属性数组中未包含的所有子级? 现在我必须找出实际子数组和嵌套属性数组之间的差异,然后设置_destroy:true,但看起来很难看

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)}
-类似这样的操作会为每个更新的子级创建新记录并销毁旧记录,有时可以,但不一定。