0

私は2つのモデルを持っています(ABを呼び出します)。ネストされた属性を持つコールバックbefore_updateコールバック

Ahas_manyb sおよびBbelongs_toA。それ以外

class A < ApplicationRecord 
    has_many :bs, dependent: :destroy, inverse_of: :a 
    accepts_nested_attributes_for :bs, reject_if: :all_blank, allow_destroy: true 
    validates_associated :bs 
end 


class B < ApplicationRecord 
    belongs_to :a, inverse_of: :bs 
    before_update :do_something, unless: Proc.new { |b| b.a.some_enum_value? if a } 

    def do_something 
    self.some_field = nil 
    end 

end 

BAsome_enum_valueセットを持っている場合はnil some_fieldを設定before_updateコールバックを持っています。私は属性フォームBを更新した場合Bからbefore_updateのみが呼び出されていることを、この関係はネストされたフォームに使用されているので

、。私がAという値の形式だけを変更した場合、そのコールバックは呼び出されません。

Aが更新されると、Bbefore_updateに電話する方法を教えてください。

ありがとうございます。それは潜在的に悲惨なパフォーマンスの結果をもたらす可能性があるため(ただし、このオプションはhas_many関係のために存在していません

class B < ApplicationRecord 
    belongs_to :a, inverse_of: :bs, touch: true 
end 

あなたはB. を更新するときa.updated_atを更新します:団体に属しているため

答えて

2

あなたはtouchオプションを使用することができますAに1000s以上のBsがある場合)。

ただし、あなた自身をロールバックすることができます:

class A < ApplicationRecord 
    has_many :bs, dependent: :destroy, inverse_of: :a 
    accepts_nested_attributes_for :bs, reject_if: :all_blank, allow_destroy: true 
    validates_associated :bs 
    after_update :cascade_update! 

    def cascade_update! 
    # http://api.rubyonrails.org/classes/ActiveRecord/Batches.html#method-i-find_each 
    bs.find_each(batch_size: 100) do |b| 
     b.touch 
    end 
    end 
end 
+2

あなたはこのような何かをやったときには本当に注意する必要があるスケーリングの観点から。書き込み操作は高価で、通常はプロキシまたは結合を使用してこれを解決できます。 – max

+0

ありがとう、マックス。 – ThalesMiguel

関連する問題