2016-01-20 1 views
1

У меня есть приложение рельсы со следующими моделями:Rails SQL запросы на таблицу соединения

class Partner < ActiveRecord::Base 
    has_many :timesheets 
    has_many :timeslots, through: :timesheets 
    # ... 
end 

class Timeslot < ActiveRecord::Base 
    has_many :timesheets 
    has_many :partners, through: :timesheets 
    # ... 
end 

class Timesheet < ActiveRecord::Base 
    belongs_to :partner 
    belongs_to :timeslot 
    # ... 
end 

Обратите внимание, как Timesheet служит присоединиться к таблице сортов для хранения пар Партнера-Timeslot. Я хочу получить все такие пары Partner-Timeslot, где временные интервалы выполняют какое-то условие. Мне вообще неинтересно об объекте Timesheet для этого запроса. Я работал, что соответствующий SQL является то, что вдоль линий:

SELECT partners.*, timeslots.* 
FROM timesheets 
    JOIN partners 
    ON timesheets.partner_id = partners.id 
    JOIN timeslots 
    ON timesheets.timeslot_id = timeslots.id 
WHERE (...some condition logic that I can figure out on my own...) 

Обратите внимание, как хотя я запрашивая таблицу Timesheets я на самом деле только хочу партнера и Timeslot объекты.

Можете ли вы сделать это с помощью Rails?

Есть ли лучший способ сделать это?

Прочая информация:

Я использую MySQL в качестве базы данных

ответ

1

Да, вы можете, конечно, сделать это в Rails. Вы могли бы начать с:

partner_timeslots = Partner.joins([ timesheets: :timeslot ]).select('partners.*, timeslots.*') 

Это будет генерировать следующий запрос:

select partners.*, timeslots.* 
from partners 
    inner join timesheets on timesheets.partner_id = partners.id 
    inner join timeslots on timeslots.id = timesheets.timeslot_id 

Если попытка на консоли, попробуйте partner_timeslots.to_yaml, чтобы увидеть все partners и timeslots атрибуты возвращены.

+0

Я нашел to_json, чтобы быть более полезным, чем to_yaml, но спасибо! Я думаю, что, наконец, я начинаю понимать этот материал. – dwoodwardgb

Смежные вопросы