这是我现在正在尝试做的事情:A has_many Bs。B 有某些需要触发的回调。只是,当我从 A 保存时,我想在 Bs 中更新一些东西。由于 Bs 可以是 10000,我不想将它们加载到内存中,并且仍然可以看到触发的回调。最好的策略是什么?
请不要“find_each”或任何按批次查找的变体,我知道它们,如果没有其他方法,它们将是我的最后手段。
这是我现在正在尝试做的事情:A has_many Bs。B 有某些需要触发的回调。只是,当我从 A 保存时,我想在 Bs 中更新一些东西。由于 Bs 可以是 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 })