|
- module AcceptsNestedAttributesHelper
- extend ActiveSupport::Concern
-
- def build_accepts_nested_attributes(obj, relations, data)
- # 新记录,全部为创建
- return data if obj.new_record?
-
- # 更新时,需要处理删除数据
- old_ids = relations.loaded? ? relations.map(&:id) : relations.pluck(:id)
- new_ids =
- data.map do |item|
- yield(item) if block_given?
-
- # 处理参数中错误的ID
- item[:id] = item[:id].to_i
- item[:id] = nil if item[:id].zero? || !old_ids.include?(item[:id])
- item[:id]
- end
- new_ids.compact!
-
- # 被删除的子项ID数组
- destroy_ids = old_ids - new_ids
- destroy_attributes = destroy_ids.map { |id| { id: id, _destroy: true } }
-
- data.concat(destroy_attributes)
- end
- end
|