在我的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表達式與參數類似的問題,但沒有。
出於好奇,WorkRequest.in_date_range(「2012-01-01」,「2012-10-02」)。by_status(「Accepted」)'工作嗎? – Gazler
我做到了!我太「隧道遠景」來嘗試。我確信這是由於lambda,但顯然不是。這是偉大的,我可以調用它的方式,但還是讓我不知道爲什麼in_date_range返回一個關係,by_status陣列。 Curiouser和curiouser。 –