我有一个与四个模型联系的has_many
class Integration < ActiveRecord::Base
has_many :integration_profiles
has_many :profiles, through: :integration_profiles
# has `provider` column
end
class IntegrationProfile < ActiveRecord::Base
belongs_to :integration
belongs_to :profile
# has a `data` column
end
class Profile < ActiveRecord::Base
has_many :integration_profiles
has_many :integrations, through: :integration_profiles
end
class User < ActiveRecord::Base
has_many :integrations
has_many :profiles, through: :integrations
end
每次集成创建个人资料时,我都会打电话:
p = Profile.find_or_create_by(email: "email")
鉴于我的数据库中只有1个用户,并且所有集成和配置文件应属于用户,用户与重复配置文件有多个集成,因此具有比配置文件更多的integration_profiles
u = User.first
Profile.all.count => 977
u.profiles.count => 1042
IntegrationProfile.all.count => 1042
我想要做的是将所有与相关的配置文件返回给该用户(因此只有977)与每个配置文件的属于该用户的集成提供商。换句话说,我希望输出一个配置文件以及与之关联的所有提供商(或者如果你愿意的话)。
目标是基本上做一个循环:
profiles.each do |profile|
profile.providers.each do |provider|
puts provider
end
end
我尝试了分组并且失败了。
这是我被困的地方:
u.profiles.select("*, integration_profiles.data as integration_profiles_data, integrations.provider as i_p, profiles.*")
=> returns 1042 profiles with each's i_p as provider
u.profiles.select("profiles.*, integrations.provider as ipdata").group("profiles.id, ipdata")
=> I cannot even do a count, it fails...
更新
让它像这样半工作:
<% profile.integrations.where(user_id: current_user.id).distinct.each do |int| %>
<%= int.provider %>
<% end%>
在我的控制器中使用它:
u.profiles.where(found: true).select("*, integration_profiles.data as integration_profiles_data, profiles.*").includes(integrations: :user)
这太可怕了,因为它导致了20个配置文件的96个SQL查询。任何想法如何将所有这些成为一个查询?