型号:
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;
我总是可以在Rails中执行这个SQL,但是如果可能的话,我宁愿避免这种情况并做“Rails方式”。
答案 0 :(得分:1)
你的has_many通过关系应该是这样的:
class User < ActiveRecord::Base
has_many :attendances
has_many :courses, :through => :attendances
end
class Course < ActiveRecord::Base
has_many :attendances
has_many :users, :through => :attendances
end
class Attendance < ActiveRecord::Base
belongs_to :user
belongs_to :course
end
请解释你的问题。因为
@user.courses will give you only related courses
Course.all will give you all courses
编辑:
Course.find(:all, :joins => 'LEFT OUTER JOIN attendances ON attendances.course_id =
courses.id', :conditions => ['attendances.user_id = ?', 1], :group =>
'attendances.course_id', :order => 'attendances.date DESC')
我希望它对你有用。
答案 1 :(得分:1)
“Rails-Way”用于定义模型中的小型查找器,然后将它们链接到控制器中。
在课堂出勤中,您可以定义一个新方法
def self.last_attendance
maximum("date")
end
课堂上的科西嘉......
def self.ordered
order("name DESC")
end
等等。然后在控制器中,您可以使用不同的组合。这种方法的最大优点是