假设我有以下模型
Course has_many :students
Course has_many :lectures
Lecture has_many :topics如果我这样做了:
courses = Course.find(:all, :includes => [:students, {:lectures => :topics}])我得到所有的课程,学生,讲座和主题。
我只想得到有特定学生的课程,然后对于每一门课程,我只想要拿回某些课程,但是每一堂课的所有主题。
所以,假设我想和一个名叫“约翰”的学生一起学习所有的课程,但是每一门课程都有最近的2门课,以及这2门课的所有主题。
我不明白如何将这些过滤器应用于上面的原始查询。
希望得到一些关于如何执行这样的查询的指导。
发布于 2013-04-11 20:53:13
您可以使用查询API来修改急切加载的内容:
courses = Course.includes(:students, {:lectures => :topics}).
where(:students => {:name => 'John'})获得每门课程最近的2堂课是一个重大的挑战,我不认为有一个跨数据库的解决方案可以做到这一点,而不需要递归子查询来确定排名(这将是大量数据的主要性能消耗,并取消任何急于加载的好处)。您可以确定最近的(MAX),然后再确定最近的(比最初的MAX更早的MAX),但是这种方法也会非常低效率和非常混乱。
如果您可以选择特定的DBMS,这可能是可行的。或者,选择一种不同的策略来确定“最近”(例如,每个课程上缓存的日期,或经过的固定时间)。
更新
假设您很好地加载所有讲座并手动选择前2,则可以使用as_json序列化程序(对于JSON)这样做:
courses = ... # same as above
courses.each do |c|
c.lectures = c.lectures.sort_by(&:happens_at)[-1..-2]
end.as_json(:include => [:students, {:lectures => {:include => :topics}}])https://stackoverflow.com/questions/15957768
复制相似问题