-1
clients :has_many :project,:roles

私は実装しましたが、それは良い実装ではありません。

4

2 に答える 2

2

joinsたとえば、ActivityがCarrier Activity.joins(:carrier => {:projects => {:client =>:roles}})に属するなど、いくつかのレベルで使用できます。

次の行に沿ってSQLを生成します

SELECT * from activities
JOIN carriers on activities.carrier_id = carriers.id
JOIN projects on carriers.id = projects.carrier_id
JOIN clients on projects.client_id = clients.id
JOIN roles on roles.client_id = clients.id

条件を追加できます。列名を修飾する必要があります。つまり、データベースが必要なものを認識できるようにするために、projects.id代わりに使用します。idid

于 2012-06-29T21:31:22.260 に答える
0

あなたの解決策は十分に良いです。多分あなたはこのようにそれを改善することができます:

clients = Client.joins(:roles).where("roles.name in ('responsible', 'replacement')")
client_ids = clients.map(:&id)
projects = Project.where('id in (?) && start=? && stop=?',client_ids,params[:start_time],params[:end_time])
project_ids = projects.map(:&id)
carriers = Carrier.joins(:projects).where('projects.id in (?) AND carriers.has_clients=1', project_ids)
carrier_ids = carriers.map(&:id)
activities = Activity.joins(:carriers).where('carriers.id in (?)', carrier_ids)
于 2012-06-29T17:27:21.487 に答える