我有一个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
我应该使用包含还是加入?我一直使用包括所以不确定为什么这不在这里工作
答案 0 :(得分:3)
当你这样做时
all = User.first.integrations.joins(:profiles)
all.count
对于第一个User
和profiles
上的内部联接查询,将计算整合记录。
当你做的时候
all = User.first.integrations.includes(:profiles)
all.count
再次获得集合计数BUT而不使用配置文件的连接查询,因为includes
您似乎只想将profiles
计数与给定的user
相关联。实现此目标的最佳方法是在User
和Profile
模型之间建立关联
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。
如果您想进行预先加载,则首选使用包含。