0

这是我现在正在尝试做的事情:A has_many Bs。B 有某些需要触发的回调。只是,当我从 A 保存时,我想在 Bs 中更新一些东西。由于 Bs 可以是 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 回答