ruby-on-rails - 等同于 foo_ids 的 find_each?

标签 ruby-on-rails ruby rails-activerecord

给定这个模型:

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_eachorderlimit 限制。

这种方法有点 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/

相关文章:

ruby-on-rails - 对相关集合使用 send()

ruby-on-rails - Carrierwave、Fog、Amazon S3、Rails 4

Ruby 的 string.downcase!行为

ruby-on-rails - 没有列的事件管理索引页面排序

ruby-on-rails - 由于参数不允许而无法保存

ruby-on-rails - 何时在 Ruby on Rails 中使用内存

ruby-on-rails - 为什么 Figaro gem 仅在我使用 erb 语法时才起作用?

ruby-on-rails - 如何使用 globalize2 在 I18n 中启用回退

ruby-on-rails - 在没有 ActiveRecord 的情况下使用 Ruby on Rails

ruby-on-rails - 按模型方法而不是数据库列过滤Rails