渴望通过has_many加载

时间:2014-05-04 18:28:32

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 eager-loading

我有一个User型号。

user有很多integrations

integration通过profile加入integration_profiles,其中包含data列。

我希望加载所有用户的个人资料。

class Integration < ActiveRecord::Base
 has_many :integration_profiles
 has_many :profiles, through: :integration_profiles
end

class IntegrationProfile < ActiveRecord::Base
 belongs_to :integration
 belongs_to :profile
end

class Profile < ActiveRecord::Base
 has_many :integration_profiles
 has_many :integrations, through: :integration_profiles
end

我试过了:

all = User.first.integrations.includes(:profiles)

但是当我做all.count

时我
=> 2

但是当我做的时候

all = User.first.integrations.joins(:profiles)
all.count
=> the correct total

我应该使用包含还是加入?我一直使用包括所以不确定为什么这不在这里工作

2 个答案:

答案 0 :(得分:3)

当你这样做时

all = User.first.integrations.joins(:profiles)
all.count

对于第一个Userprofiles上的内部联接查询,将计算整合记录。

当你做的时候

all = User.first.integrations.includes(:profiles)
all.count

再次获得集合计数BUT而不使用配置文件的连接查询,因为includes

因为配置文件因单独查询而急切加载

您似乎只想将profiles计数与给定的user相关联。实现此目标的最佳方法是在UserProfile模型之间建立关联

User ==> has_many :profiles, through: :integration

完成此操作后,您可以直接访问User.first.profiles.count以获取特定用户的所有相关配置文件的计数。

另一个选项是(如果您不想使用上述选项)循环遍历所有integrations并为每次整合总结所有profiles.count

选择最适合您需求的选项。

答案 1 :(得分:0)

查询1

all = User.first.integrations.includes(:profiles)

all.count正在返回整合计数而不是简档。个人资料热切地加载。

如果你想知道个人资料的数量,那么就需要这样做。

ar = [ ]

 all.each do |a|
   ar << a.profiles.count
 end
运行查询2时,

ar.reduce(:+)将为您提供相同的计数。

查询2

all = User.first.integrations.joins(:profiles)

all.count

如果是查询2,它会从integrartion_profiles表返回集成。

Select users from users limit 1;

Select integrations from integrations INNER JOIN integration_profiles on integration_profiles.integration_id = integrations.id where integrations.user_id = 'id of user'

要了解更多信息,请在查询1和查询2上调用.to_sql。

如果您想进行预先加载,则首选使用包含。