Как мне заставить Rails ActiveRecord генерировать оптимизированный SQL? - PullRequest
1 голос
/ 28 марта 2012

Допустим, у меня есть 4 модели, которые связаны между собой следующим образом:

  • В расписании есть внешний ключ для проекта
  • Расписание имеет внешний ключ для пользователя
  • Проект имеет внешний ключ для Клиента

В моем представлении Schedule # index я хочу наиболее оптимизированный SQL, чтобы я мог отображать ссылки на связанный с Schedule проект, клиент и пользователь. Поэтому я не должен тянуть все столбцы для проекта, клиента и пользователя; только их идентификаторы и имя.

Если бы я написал SQL вручную, он мог бы выглядеть так:

select 
    s.id, 
    s.schedule_name, 
    s.schedule_type, 
    s.project_id, 
    p.name project_name, 
    p.client_id client_id, 
    c.name client_name, 
    s.user_id, 
    u.login user_login, 
    s.created_at, 
    s.updated_at, 
    s.data_count
from      
    Users u inner join 
        Clients c inner join 
            Schedules s inner join 
                Projects p
            on p.id = s.project_id
        on c.id = p.client_id
    on u.id = s.user_id
order by 
    s.created_at desc

Мой вопрос: Как будет выглядеть код ActiveRecord, чтобы Rails 3 генерировал этот SQL? Например, что-то вроде:

@schedules = Schedule. # ?

У меня уже есть настройки связей в моделях (то есть has_many / own_to).

1 Ответ

0 голосов
/ 28 марта 2012

Я думаю, что это создаст (или, по крайней мере, поможет) вам получить то, что вы ищете:

Schedule.select("schedules.id, schedules.schedule_name, projects.name as project_name").joins(:user, :project=>:client).order("schedules.created_at DESC")

должно дать:

SELECT schedules.id, schedules.schedule_name, projects.name as project_name FROM `schedules` INNER JOIN `users` ON `users`.`id` = `schedules`.`user_id` INNER JOIN `projects` ON `projects`.`id` = `schedules`.`project_id` INNER JOIN `clients` ON `clients`.`id` = `projects`.`client_id`

Основная проблема, которую я вижу вваш подход заключается в том, что вы ищете объекты расписания, но исходное предложение «FROM» основано на «User», а ваши сопоставления приведены также в Schedule, поэтому я построил это решение на основе простого предположения о том, что вам нужны расписания!

Я также не включил все ваши варианты выбора, чтобы сохранить набор текста, но вы поняли идею.Вам просто нужно будет добавить каждого квалифицированного с полным именем таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...