Модели:
class User < ActiveRecord::Base
has_many :attendances
has_many :courses, :through => :attendances
end
class Course < ActiveRecord::Base
has_many :attendances
end
class Attendance < ActiveRecord::Base
belongs_to :user
belongs_to :course
end
Миграции:
create_table(:users) do |t|
t.string :name
end
create_table(:courses) do |t|
t.string :name
end
create_table(:attendances) do |t|
t.references :user, :course
t.date :date
end
Вопрос
Я хотел бы запросить:
- список всех курсов
- дата последнего посещения данного пользователя (если есть) для каждого курса
Каков наилучший способ связать следующее водин запрос?
@courses = Course.all
@user = User.first
@attendances = @user.attendances.group('course_id').order('date DESC')
Обратите внимание, что существует требование включать курсы, которые пользователь еще не посещал.
Любой совет, который высоко ценится.
Обновление
Результат, который я ищу, выглядит следующим образом:
Course Last attended
===============================
Some course 2011-03-09
More training Not Attended
Another course 2010-12-25
В SQL я написал бы этот запрос как:
SELECT * FROM courses AS c
LEFT OUTER JOIN attendances AS a ON a.course_id=c.id
WHERE a.user_id=1
GROUP BY a.course_id
ORDER BY a.date DESC;
Я всегда могвыполнить этот SQL изнутри Rails, но я бы предпочел избежать этого и, если это возможно, делать что-то «по пути Rails».