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
上のすべての単一の可能なタイプのための関連付けを追加するために私を必要とするということです。
問題はどうしたらいいですか?
あなたが参加し、テーブル上の条件を使用してみましたか? 'Company.eager_load(:employees).where(従業員:{title: 'CTO'})'。それはまた、あなたが望む結果セットに依存します。 CTOというタイトルの従業員のいない企業が欲しいですか? LEFT OUTER JOINを使用する必要があります。そうでない場合は、INNER JOINにする必要があります。 http://blog.arkency.com/2013/12/rails4-preloading/ – max