accepts_nested_attributes_for:销毁未包含在数组

时间:2015-08-24 08:44:09

标签: 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_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

0 个答案:

没有答案