0

これは私が今やろうとしていることです:Ahas_manyBs。Bには、トリガーする必要のある特定のコールバックがあります。ただ、Aから保存するときは、Bで何かを更新したいです。Bは10000になる可能性があるため、メモリにロードせずに、コールバックがトリガーされるのを確認できるという利点があります。このための最良の戦略は何ですか?

また、「find_each」やバッチによる検索のバリエーションはありません。私はそれらを認識しており、他に何も機能しない場合の最後の手段になります。

4

2 に答える 2

0

この問題に遭遇したとき、私はこの解決策を使用します

  • クラスで「コールバック メソッド」を定義し、それらを ID とともに使用します。
  • インスタンスで本当にコールバックを定義し、「クラス コールバック」でレコードの ID を渡します

コードの例:

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
于 2012-10-26T15:18:55.863 に答える
0

モデルをロードせずにコールバックを実行する方法はないと思います。ただし、コールバックの使用をあきらめた場合は、update_all非常に高速に実行できるコールバックを使用できます。

あなたはただ使う:

B.update_all({:timestamp => Time.now}, { :a_id => id })
于 2012-10-26T16:19:56.150 に答える