2012-06-29 86 views
-1
clients :has_many :project,:roles 

我已經實現,但它不是一個良好的執行..Rails的查詢連接

+1

你可以嘗試解釋你想要實現的更好一點嗎? – simonmorley

+0

simonmorley我已經更新了我的問題,如果您有任何疑問,請讓我回答? –

+0

我還是不太瞭解你的問題。你看過這些railscasts中的一個嗎? http://railscasts.com/episodes/202-active-record-queries-in-rails-3 – simonmorley

回答

2

joins可用於幾個層次深,例如該活動屬於運營商 Activity.joins(:載體=> {:項目=> {:客戶端=>:角色}})

會生成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而不是僅使用id,以便數據庫知道您需要哪個id

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)