ここですべきことは、必要に応じてヘルパー関数を作成することだと思います。あなたの関連チェーンの始まりがここにあるのかはわかりませんが、おそらく#event
を返すメソッドを割り当てますevent_role.event
。そこから、event
は#boss_role
、または意味的に意味のあるものを持ち、そのメソッドは
event_roles.joins(:mission_role).where(:mission_roles => {:title => 'Boss'}).first
最後に、Event
モデルにも#boss
メソッドがあります。
boss_roles.first.person_event_roles.first.person
したがって、元のクエリは次のようになります
@person_event_role.event.boss
チェーンの各脚は自己完結型で理解しやすく、チェーンの開始点が終了点について全知である必要はありません。これらの関連付けの完全な範囲を完全に理解しているわけではありませんが、それを 3 つまたは 4 つのモデル メソッドに分割するだけで、探している懸念事項を明確に読み取って分離できると確信しています。さらに読みやすくするために、さらに細分化することもできますが、それはスタイルの問題になります。
それが役立つことを願っています!
以下、元の質問者による
私はこのアドバイスに従って、最終的に次のようになったと思います。
@person_event_role.get_related_event_roles_for('Boss').first.filled_by.first
#person_event_role:
def get_related_event_roles_for(role)
event.event_roles_for(role)
end
def event
event_role.event
end
#event:
def event_roles_for(role)
event_roles.for_role(role)
end
#event_role:
scope :for_role, lambda {|role| joins(:mission_role).where(:mission_roles => {:title => role})}
def filled_by
person_event_roles.collect {|per| per.person}
end