関連するモデルを絞り込む

状況

従業員は本店・支店の少なくともいずれかに属し((両方に属する場合もあり、その関連は従業員(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 問題が起きてしまうのでもっとちゃんとしないとダメらしい。