2012-01-21 6 views
0

私は現在の役割に関連する特定の役割を見つけるために、醜い質問をしています。この行は正しい結果生成:これにDemeterの法則を適用するにはどうすればよいですか?

@person_event_role.event_role.event.event_roles. 
    joins(:mission_role).where(:mission_roles => {:title => 'Boss'}). 
    first.person_event_roles.first.person 

(あなたがこれらの呼び出し、複数の関連を推測することができます)

この情報を取得する唯一の方法は、データベースの構造の知識のトンを必要とし、カップリングを削除するには...必要な情報を返すために、そのチェーンの各ステップでたくさんのヘルパー関数を埋め込む必要があります。

答えて

1

ここでやるべきことはヘルパー関数を作成することです適切な場において。私はあなたの連鎖の始まりが何であるかはっきりしていませんが、event_role.eventを返すメソッド#eventを割り当てると思います。そこから、event#boss_roleを持っている、または何が意味的に理にかなって、その方法は

event_roles.joins(:mission_role).where(:mission_roles => {:title => 'Boss'}).first 

最後に、またEventモデルに、そう

boss_roles.first.person_event_roles.first.person 

を取得#boss方法、ありますあり、元のクエリは

@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 
+0

が、それは多くの相互作用のひとつだ:以下

は、私はこのアドバイスに従い、になってしまったと考え、元の質問者

でありますこれらのトンでいっぱいになる... – DGM

関連する問題