【问题标题】: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"=&gt;{"activity_ids"=&gt;["10", "20"]} 的更新时,如果我在 balance_sheet 对象上加载了以前的活动,则替换活动集合。 我不想覆盖活动的旧值,我想添加新值。我该怎么做?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord nested-forms nested-attributes


    【解决方案1】:

    不要直接更新 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 
    

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 2019-10-11
      • 2021-11-10
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多