Rails - 在has_many ActiveRecord结果中迭代

时间:2014-04-27 08:16:49

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

Company has_many :profiles, through: :other_model
Profile has_many :companies, through:  :other_model

OtherModel belongs_to :profile
OtherModel belongs_to :company

作为查询的结果,我有一系列公司。

获取所有子输入(配置文件)的更有效方法是什么?

2 个答案:

答案 0 :(得分:2)

查询Company模型时,您可以eager load配置文件:

@companies = Company.where(foo: foo).includes(:profiles) 

假设where的{​​{1}}查询返回公司的ID为1,2,3 上面的activerecord查询应该在两个查询后执行:

Company

现在,返回的SELECT * FROM companies WHERE (foo = 'foo') SELECT profiles.* FROM profiles WHERE (profiles.company_id IN (1,2,3)) 将为每家公司提供相应的@companies,您只需:profiles即可访问首批公司资料

请注意,获取这些@companies.first.profiles记录是在不运行任何进一步数据库查询的情况下完成的,这是急切加载的重点

更新

返回的结果将在profiles中,以便您可以立即获取所有配置文件:

ActiveRecord::Relation

答案 1 :(得分:0)

如果belongs_to :company型号中存在Profile关系:

class Profile < ActiveRecord::Base

  belongs_to :company

end

表示company_id模型中的Profile为<{1}}。

所以你可以这样做:

Profile.where(company_id: companies)

其中companiesCompany ActiveRecord::Relation

结果为SQL

"SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`company_id` IN (1, 2)"

<强>更新

由于您使用中间模型OtherModel,您可以执行以下操作:

Profile.where(id: OtherModel.where(company_id: companies).pluck(:profile_id))