2012-10-04 119 views
0

我有ProjectEntry作爲模型。項目可以有多個條目,並且條目僅屬於一個項目。條目有日期。導軌3鏈式關聯和範圍

一個報告要求是顯示具有特定月份的條目的項目。我已經成功使用示波器來實現這個目標,即Project.with_entries.on(param_the_month)

問題是我現在只想顯示那個月的項目,按項目分組。 如果我做projects.each do |p|,然後查詢條目(p.entries),返回的條目是所有月份,而不僅僅是我指定的月份。

儘管這是一個顯而易見的結果,但是Rails中有沒有一種方法可以簡單地使用原始鏈接範圍返回該月的條目?

回答

1

has-many協會也接受範圍,所以你可以做projects.entries.your_scope來過濾它們。缺點是這將需要對每個項目進行另一個數據庫查詢,根據數據庫的大小,這可能會很慢。

的替代方案,不需要額外的查詢將獲取已過濾條目,然後再往上走,以獲得項目:

entries = Entry.my_conditions.includes(:project) 
entries_by_project = entries.group_by(&:project) 

現在你有一個哈希的鍵是項目,以及價值只是通過你的條件的項目的條目。

1

您可以將include添加到您的作用域中,這樣它不會再次查詢這些記錄,它會在您使用項目作用域時急切地加載它們。

scope :my_scope, includes(:entries).where(:active => true) 
2

編輯:我沒有誤會:)

以2:您可以在模型合併範圍。所以,如果你可以創建一個Entrywhere範圍選擇從某一個月的條目,然後你可以嘗試這樣

Project.with_entries.on(param_the_month).merge(Entry.on(param_the_month)) 

我通過類比示波器稱之爲onProject - 沒有看到你數據模型我不能說如何實現它。

+0

的with_entries返回具有條目,以及「關於」項目是另一個範疇的項目 – RailinginDFW

+0

祝你剛纔回答,已經接受了另一個解決方案 – RailinginDFW

+0

好了,如果這個問題解決了,那麼我沒有理解正確的話:)如果一個項目有兩個條目,一個符合您的條件,一個不符合條件,您希望兩個條目或僅匹配一個條目?我問這是因爲在上面一行的返回中調用'#entries'會返回兩個條目。 –