ActiveRecord选择帐户中包含3列的不同记录

时间:2016-06-07 17:24:10

标签: mysql ruby-on-rails sqlite activerecord

在以下情形中:

ClassHour (teacher_id, room_id, hour_id, group_id, subject_id)

我需要获得给定教师的所有class_hours而不考虑group_id。

id    teacher_id    room_id    hour_id    group_id    subject_id
1         1            1          1          1            1
2         1            1          1          2            1
3         1            2          2          1            1
4         2            1          3          2            3

我只需要获得给定教师的unique records on room_id, hour_id and subject_id

这是:teacher_one.schedule应该返回class_hours with ids [1,3],因为id == 2的{​​{1}}不是唯一的。

简而言之:如果我的老师的ID为1,则teacher.schedule需要返回:

id    teacher_id    room_id    hour_id    group_id    subject_id
1         1            1          1          1            1
3         1            2          2          1            1

1 个答案:

答案 0 :(得分:0)

在HackHands会议之后,我们已经以此结束,这完全有效:

class Teacher
  ...
  def schedule
    ids = ClassHour.find_by_sql(['SELECT max(class_hours.id) mid FROM class_hours inner join hours on class_hours.hour_id = hours.id inner join rooms on class_hours.room_id = rooms.id where class_hours.teacher_id = ? group by hours.id, rooms.id', self.id]).map { |x| x['mid'] }
    ClassHour.find ids
  end
end

但我并不完全理解为什么这个查询会按我的意愿运作。如果有人能够解释,那就太好了。