通过每个模型的数据点确定has_many的范围

时间:2014-05-07 00:32:40

标签: ruby-on-rails postgresql ruby-on-rails-4 ruby-on-rails-3.2 has-many-through

我有一个与四个模型联系的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查询。任何想法如何将所有这些成为一个查询?

0 个答案:

没有答案