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

내가 구현 한 조인하지만 안 좋은 구현 ..레일 쿼리

+1

좀 더 나은 것을 얻으 려 노력할 수 있습니까? – simonmorley

+0

simonmorley 내 질문을 업데이트했습니다. 문의 사항이 있으면 알려주세요. –

+0

나는 아직도 너를 정말로 이해하지 못한다. 이 railscasts 중 하나를 본 적이 있습니까? http://railscasts.com/episodes/202-active-record-queries-in-rails-3 – simonmorley

답변

2

joins 깊은 여러 수준을 사용할 수 있습니다, 예를 들어 그 활동 캐리어 Activity.joins (에 속하는 : 캐리어 => {: 프로젝트 => {: 클라이언트 => : 역할}})

당신이 당신의 조건을 추가 할 수있는

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 

의 라인을 따라 SQL을 생성합니다. 열 이름을 정규화해야합니다. 즉, id 대신 projects.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)