【问题标题】:how to avoid overwriting nested attributes?如何避免覆盖嵌套属性?
【发布时间】:2015-08-20 18:13:45
【问题描述】:
我有:
class Activity < ActiveRecord::Base
has_and_belongs_to_many :balance_sheets
end
和
class BalanceSheet < ActiveRecord::Base
has_and_belongs_to_many :activities
accepts_nested_attributes_for :activities
end
当我执行发送"balance_sheet"=>{"activity_ids"=>["10", "20"]} 的更新时,如果我在 balance_sheet 对象上加载了以前的活动,则替换活动集合。 我不想覆盖活动的旧值,我想添加新值。我该怎么做?
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-4
activerecord
nested-forms
nested-attributes
【解决方案1】:
不要直接更新 BalanceSheet 对象。相反,创建一个中间 BalanceSheetUpdater 类,它将获取您的activity_ids 并将其附加到现有的balance_sheet 的activity_ids。
class BalanceSheetUpdater
def initialize balance_sheet
@balance_sheet = balance_sheet
end
def call(balance_sheet_params)
new_ids = balance_sheet_params.delete("activity_ids")
update_status = @balance_sheet.update(balance_sheet_params)
if update_status
existing_ids = @balance_sheet.activity_ids
@balance_sheet.update(existing_ids + new_ids)
end
update_status
end
end
# controller
updater = BalanceSheetUpdater.new(@balance_sheet)
if updater.call(balance_sheet_params)
... # success / fail actions