これは私が今やろうとしていることです:Ahas_manyBs。Bには、トリガーする必要のある特定のコールバックがあります。ただ、Aから保存するときは、Bで何かを更新したいです。Bは10000になる可能性があるため、メモリにロードせずに、コールバックがトリガーされるのを確認できるという利点があります。このための最良の戦略は何ですか?
また、「find_each」やバッチによる検索のバリエーションはありません。私はそれらを認識しており、他に何も機能しない場合の最後の手段になります。
これは私が今やろうとしていることです:Ahas_manyBs。Bには、トリガーする必要のある特定のコールバックがあります。ただ、Aから保存するときは、Bで何かを更新したいです。Bは10000になる可能性があるため、メモリにロードせずに、コールバックがトリガーされるのを確認できるという利点があります。このための最良の戦略は何ですか?
また、「find_each」やバッチによる検索のバリエーションはありません。私はそれらを認識しており、他に何も機能しない場合の最後の手段になります。
この問題に遭遇したとき、私はこの解決策を使用します
コードの例:
class Post < AR
has_many :comments
after_save do |post|
Post.recalculate_counters(post.comment_ids)
end
end
class Comment < AR
belongs_to :post
after_save :recalculate_couters
def self.recalculate_couters(ids)
... huge and slow update statement ...
end
def recalcuate_couters
self.class.recalculate_couters([id])
end
end
モデルをロードせずにコールバックを実行する方法はないと思います。ただし、コールバックの使用をあきらめた場合は、update_all
非常に高速に実行できるコールバックを使用できます。
あなたはただ使う:
B.update_all({:timestamp => Time.now}, { :a_id => id })