clients :has_many :project,:roles
Я реализовать, но не очень хорошая реализация ..Rails запрос для внутренних соединений
clients :has_many :project,:roles
Я реализовать, но не очень хорошая реализация ..Rails запрос для внутренних соединений
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
вы хотите.
Вашего решения является достаточно хорошей. Может быть, вы можете улучшить его, как это:
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)
Не могли бы вы попытаться объяснить, что вы пытаетесь добиться немного лучше? – simonmorley
simonmorley Я обновил свой вопрос, пожалуйста, позвольте мне, если у вас есть какие-либо вопросы? –
Я до сих пор не понимаю вас. Вы смотрели один из этих рельсов? http://railscasts.com/episodes/202-active-record-queries-in-rails-3 – simonmorley