関連するモデルを絞り込む
状況
従業員は本店・支店の少なくともいずれかに属し((両方に属する場合もあり、その関連は従業員(employees)と支店(branches)を中間テーブル branches_employees
で結びつけている。))、上司(manager)と部下(assistants)がアソシエーションで紐付けられている。今、本店に所属する従業員の部下で、同じく本店に所属する人だけを取得したい。
暫定的に取っている方法
@employees = Branch.find_by_name('本店').employees
として
<% @employees.each do |e| %> ... <%= e.assistants.to_a.find_all { |a| @employees.include?(a) } ... %> ... <% end %>
のように判定させているんだけど、もっと上手い方法はないかなぁ ?
追記 : scope
を使うと上手く行った。
class Employee < ActiveRecord::Base has_and_belongs_to_many :branches belongs_to :manager, :class_name => 'Employee', :foreign_key => 'mgr_id' has_many :assistants, :class_name => 'Employee', :foreign_key => 'mgr_id' has_many :sales scope :belongs, lambda { |b| joins(:branches).where(:branches => { :name => b }) } end
@employees = Employee.belongs('本店')
<% @employees.each do |e| %> ... <%= e.assistants.belongs('本店').map{ |a| a.name }.join(',') %> ... <% end %>
2013/07/16 追記 : この書き方だと SQL の N + 1 問題が起きてしまうのでもっとちゃんとしないとダメらしい。