0

我:如何避免覆盖嵌套属性?

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对象上以前的活动执行UPDATE发送"balance_sheet"=>{"activity_ids"=>["10", "20"]},活动集合被替换。 我不想覆盖活动的旧值,我想添加新的。我怎样才能做到这一点?

回答

0

不要直接更新BalanceSheet对象。相反,创建一个中间BalanceSheetUpdater类,它将把您的activity_ids并附加到现有的balance_sheetactivity_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