2013-04-11 97 views
2

說我有以下型號ActiveRecord的查詢過濾嵌套模型

Course has_many :students 
Course has_many :lectures 
Lecture has_many :topics 

如果我做的:

courses = Course.find(:all, :includes => [:students, {:lectures => :topics}]) 

我得到的所有課程,學生,講座和主題。

我想只有具有一定的學生他們,然後爲每個課程只希望得到一定的講課回來課程,但所有的主題爲每個講座。

所以說我想用一個名爲「約翰」的學生,但只有2個最近的講座爲每個課程和所有的主題爲那些2個講座的所有課程。

我不明白如何將這些過濾器應用到上面的原始查詢。

想了解如何執行這些查詢的一些指導。

+0

進出口使用的軌道:

UPDATE

假設你是罰款只是預先加載所有的講座和手動選擇頂部2,你可以使用as_json串行做到這一點(對JSON) 3.2 – 2013-04-11 20:49:24

+0

我建議使用gem「squeel」(https://github.com/ernie/squeel)。它具有更直觀的語法,你可以在github找到你要找的文檔 – benams 2013-04-11 20:50:39

+0

你在看什麼領域來確定演講是否是'最近的'? – PinnyM 2013-04-11 20:51:30

回答

0

你會使用查詢API修改什麼是渴望加載:

courses = Course.includes(:students, {:lectures => :topics}). 
       where(:students => {:name => 'John'}) 

剛剛獲得每門課程2個最近的演講是一大挑戰,我不相信這是一個跨數據庫解決方案將在沒有遞歸子查詢的情況下執行此操作來確定排名(這將是重要數據量的主要性能消耗,並取消任何加載的好處)。您可以確定最近的(MAX),然後再確定最近的那個(MAX比先前的MAX早),但這種方法也是非常低效且非常混亂的。

如果你可以選擇一個特定的DBMS,這可能是可行的。或者,選擇一種不同的策略來確定「最近」(例如每個課程的緩存日期,或者一段固定的時間)。

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

謝謝,如果我正在做這個查詢返回一個JSON blob,我將如何構建它與最新的講座。 ['code'] courses = Course.where(:students => {:name =>'John'}) courses.each do | course | 當然[:most_recent] = course.lectures.order(:happens_at)。首先 當然[:next_recent] = course.lectures.order(:happens_at)[1] 端 [/'code'] 似乎彆扭雖然 – 2013-04-12 13:16:31

+0

@johnsample:爲此更新。 – PinnyM 2013-04-12 13:55:24