在最近从Rails 3移植到Rails 4的应用程序中,我有一个名为MeetingSeries的模型,具有以下关系:
SELECT s.student_name, MIN(m.value) AS minimum_marks
FROM student s
JOIN mark m ON s.student_id = m.student_id
GROUP BY s1.student_id
HAVING MIN(m.value) > 50
ORDER BY s.student_name ASC
会议模型具有以下范围:
has_many :meetings, :foreign_key => :series_id
因此,如果我有特定的会议系列:
scope :future, -> { where("start_time is not NULL and end_time > ?", DateTime.now())}
我可以像这样抓取该系列的所有会议:
@m = MeetingSeries.find(42)
在这种情况下,我正确地得到了仅属于指定系列的少量会议。但是,当我使用范围时:
@m.meetings
我突然得到了所有将来的会议,而不仅仅是指定系列中的会议。为这两个构建的SQL查询是非常不同的,并且很明显的事实是,序列ID不是查询的一部分:
@m.meetings.future
对:
irb(main):003:0> @m.meetings.count()
(1.5ms) SELECT COUNT(*) FROM `meetings` WHERE `meetings`.`type` IN ('Meeting') AND `meetings`.`series_id` = 9856
=> 78
这在Rails 3下表现正常,所以我收集到错误的行为是由于Rails 4在作用域或ActiveRecordRelations工作方式上的某些差异引起的。