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

Я реализовать, но не очень хорошая реализация ..Rails запрос для внутренних соединений

+1

Не могли бы вы попытаться объяснить, что вы пытаетесь добиться немного лучше? – simonmorley

+0

simonmorley Я обновил свой вопрос, пожалуйста, позвольте мне, если у вас есть какие-либо вопросы? –

+0

Я до сих пор не понимаю вас. Вы смотрели один из этих рельсов? http://railscasts.com/episodes/202-active-record-queries-in-rails-3 – simonmorley

ответ

2

joins можно использовать несколько уровней глубоко, например, что активность принадлежит Carrier 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) 
Смежные вопросы