[英]Rails 3.2: Chaining lambda scopes?
在我的Rails 3.2.8應用程序中,我有一些命名作用域,在某些情況下,我想將它們鏈接在一起。
因此,例如,我有以下兩個范圍:
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")
有用! 顯然,活動范圍返回一個Relation,而lambda范圍返回Array,因此無法鏈接。
我很想知道為什么更簡單的作用域和lambda作用域之間的區別,參數如何影響它,以及除了編寫合並的作用域之外我是否還能做些什么。
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。
發生這種情況是因為在您的范圍內
scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
all
, find_all_by_status
返回Array
而不是ActiveRecord::Relation
。 例如,應將其替換為where
。
scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.