2012-10-02 93 views
0

在我的Rails 3.2.8應用程序我有一些命名範圍,我想起來鏈在某些情況下。Rails 3.2:鏈接lambda範圍?

因此,舉例來說,我有這兩個範圍:

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end } 
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) } 

我分開使用,但我也希望能夠在一起叫這樣的:

WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02") 

當我嘗試它抱怨in_date_range不是Array的一種方法。

但我還有一個範圍,

scope :active, includes([:person, :pier_module]).where("status = 'New Request'") 

,如果我做

WorkRequest.active.in_date_range("2012-01-01", "2012-10-02") 

它的作品!顯然,活躍範圍返回一個關係,而拉姆達範圍返回數組,因此不能被鏈接。

我很想知道爲什麼簡單的作用域和拉姆達範圍,參數對它的影響,以及是否有什麼我可以做短寫一個聯合的範圍,這是我做過的之間的區別。

scope :by_status_in_date_range, lambda { |status, start_date, end_date| includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) } 

工作,但不是非常乾燥(因爲我需要單獨的範圍)或Rails-ish。搜索這裏和其他地方我已經看到了似乎適用於這種情況,在那裏我試圖鏈上的兩個lambda表達式與參數類似的問題,但沒有。

+1

出於好奇,WorkRequest.in_date_range(「2012-01-01」,「2012-10-02」)。by_status(「Accepted」)'工作嗎? – Gazler

+0

我做到了!我太「隧道遠景」來嘗試。我確信這是由於lambda,但顯然不是。這是偉大的,我可以調用它的方式,但還是讓我不知道爲什麼in_date_range返回一個關係,by_status陣列。 Curiouser和curiouser。 –

回答

5

這發生的,因爲在你的範圍

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end } 

metods allfind_all_by_status回報Array代替ActiveRecord::Relation。例如,您應該將其替換爲where

scope :by_status, lambda { |status| where(:status => status) unless status == "All" } 
+0

謝謝,ck3g,這是有道理的!我會看看我是否可以改變它返回一個關係。 –

+0

鏈接中的範圍的權力。 – ck3g