给定这个模型:
class User < ActiveRecord::Base
has_many :things
end
然后我们可以这样做::
@user = User.find(123)
@user.things.find_each{ |t| print t.name }
@user.thing_ids.each{ |id| print id }
有大量的 @user.things
,我只想批量遍历它们的 ID,就像 find_each
一样。有没有方便的方法来做到这一点?
目标是:
- 不要一次将整个
thing_ids
数组加载到内存中 - 仍然只加载
thing_ids
数组,而不是为每个id实例化一个Thing
最佳答案
引入 Rails 5 in_batches
方法,它产生一个关系并在内部使用 pluck(primary_key)
。我们可以利用 where_values_hash
关系的方法,以检索已经采摘的 id:
@user.things.in_batches { |batch_rel| p batch_rel.where_values_hash['id'] }
请注意,in_batches
具有类似于 find_each
的 order
和 limit
限制。
这种方法有点 hacky,因为它依赖于 in_batches
的内部实现,如果 in_batches
将来停止提取 ID,将会失败。一个非 hacky 方法是 batch_rel.pluck(:id)
,但这会运行相同的 pluck 查询两次。
关于ruby-on-rails - 等同于 foo_ids 的 find_each?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28350951/