为什么find_in_batches无法包含has_many through关系中的所有记录

时间:2013-03-27 19:41:35

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord

给出以下代码

class Things < ActiveRecord::Base
  belongs_to :user
  belongs_to :sock
end

class User < ActiveRecord::Base
  has_many :things
  has_many :socks, through: :things
end

class Sock < ActiveRecord::Base
  has_many :things
  has_many :users, through: :things
end

假设第一个用户有两个袜子而所有其他用户都有一个袜子。总共有1000个用户和1001个袜子。您希望find_in_batches返回与正常选择相同数量的记录。

User.joins(:socks).count
=> 1001
agg = []
User.joins(:socks).find_in_batches{|g| agg += g}
agg.count
=> 1000

1 个答案:

答案 0 :(得分:1)

你必须从关系的另一端开始,因为find_in_batches使用主键来确定从哪里开始搜索结果(SELECT ... FROM ... WHERE id&gt; N LIMIT 1000)< / p>

Sock.joins(:users).count
=> 1001
agg = []
Sock.joins(:users).find_in_batches{|g| agg += g}
agg.count
=> 1001