2016-12-05 4 views
0

私は、次の2つのモデルがあります:私の使用例Railsで条件付関連付けを効果的にプリロードするにはどうすればよいですか?

class Company < ActiveRecord::Base 
    has_many :employees # A company can have 1000's of employees. 
end 

class Employee < ActiveRecord::Base 
    belongs_to :company 
end 

一つは、コントローラでは、この

次のようになります。ビューで

def my_action 
    @companies = Company.where(country: 'GB').preload(:employees) 
    @title = params[:title] # E.g. 'CTO' 
end 

を:

- @companies.each do |c| 
    = c.employees.where(title: @title).first.last_name 

上記の問題は、ビュー内にN + 1を作成することです。

今、私はビューを変更できます。これは、1 + Nを解決しますが、それはまだ私はそれらを必要としないにもかかわらず、従業員レコードの潜在的に1000のをロードします

# In the view 
- @companies.each do |c| 
    = c.employees.select{|e| e.title == @title}.first.last_name 

(私だけ必要正しいタイトルのもの)。

私がであること解決することができ:

class Company < ActiveRecord::Base 
    has_many :employees 
    has_many :ctos, ->{ where(title: 'CTO') } 
end 

# In the controller 
def my_action 
    @companies = Company.where(country: 'GB').preload(:ctos) 
end 

# In the view 
- @companies.each do |c| 
    = c.ctos.first.last_name 

これに伴う問題は、しかし、それはCompany上のすべての単一の可能なタイプのための関連付けを追加するために私を必要とするということです。

問題はどうしたらいいですか?

+0

あなたが参加し、テーブル上の条件を使用してみましたか? 'Company.eager_load(:employees).where(従業員:{title: 'CTO'})'。それはまた、あなたが望む結果セットに依存します。 CTOというタイトルの従業員のいない企業が欲しいですか? LEFT OUTER JOINを使用する必要があります。そうでない場合は、INNER JOINにする必要があります。 http://blog.arkency.com/2013/12/rails4-preloading/ – max

答えて

0
companies = Company.where(country: 'GB') 
title = params[:title] 
@company_employee = Employee.where(company: companies, title: title).group_by(&:company) 

@company_employeeは、その構造とハッシュになります{会社=> [従業員]}

関連する問題