首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveRecord查询过滤嵌套模型

ActiveRecord查询过滤嵌套模型
EN

Stack Overflow用户
提问于 2013-04-11 19:59:08
回答 1查看 955关注 0票数 2

假设我有以下模型

代码语言:javascript
复制
Course has_many :students
Course has_many :lectures
Lecture has_many :topics

如果我这样做了:

代码语言:javascript
复制
courses = Course.find(:all, :includes => [:students, {:lectures => :topics}])

我得到所有的课程,学生,讲座和主题。

我只想得到有特定学生的课程,然后对于每一门课程,我只想要拿回某些课程,但是每一堂课的所有主题。

所以,假设我想和一个名叫“约翰”的学生一起学习所有的课程,但是每一门课程都有最近的2门课,以及这2门课的所有主题。

我不明白如何将这些过滤器应用于上面的原始查询。

希望得到一些关于如何执行这样的查询的指导。

EN

回答 1

Stack Overflow用户

发布于 2013-04-11 20:53:13

您可以使用查询API来修改急切加载的内容:

代码语言:javascript
复制
courses = Course.includes(:students, {:lectures => :topics}).
                 where(:students => {:name => 'John'})

获得每门课程最近的2堂课是一个重大的挑战,我不认为有一个跨数据库的解决方案可以做到这一点,而不需要递归子查询来确定排名(这将是大量数据的主要性能消耗,并取消任何急于加载的好处)。您可以确定最近的(MAX),然后再确定最近的(比最初的MAX更早的MAX),但是这种方法也会非常低效率和非常混乱。

如果您可以选择特定的DBMS,这可能是可行的。或者,选择一种不同的策略来确定“最近”(例如,每个课程上缓存的日期,或经过的固定时间)。

更新

假设您很好地加载所有讲座并手动选择前2,则可以使用as_json序列化程序(对于JSON)这样做:

代码语言:javascript
复制
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}}])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15957768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档