Rails 3.2:链接lambda范围?

Dan*_*ron 0 ruby-on-rails named-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) }
Run Code Online (Sandbox Code Playgroud)

我单独使用它们,但我也希望能够像这样一起调用它们:

WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02")
Run Code Online (Sandbox Code Playgroud)

当我尝试它时,它抱怨in_date_range不是Array的方法.

但我有另一个范围,

scope :active, includes([:person, :pier_module]).where("status = 'New Request'")
Run Code Online (Sandbox Code Playgroud)

如果我这样做

WorkRequest.active.in_date_range("2012-01-01", "2012-10-02")
Run Code Online (Sandbox Code Playgroud)

有用!显然,活动范围返回一个Relation,而lambda范围返回Arrays,因此无法链接.

我想知道为什么简单的范围和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) }
Run Code Online (Sandbox Code Playgroud)

工作,但不是很干(因为我也需要个别范围)或Rails-ish.在这里和其他地方搜索我已经看到类似的问题,但似乎没有适用于这种情况,我试图用参数链接两个lambda.

ck3*_*k3g 5

这是因为在您的范围内

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

metods all和find_all_by_status返回Array而不是ActiveRecord::Relation.你应该用它替换它where.

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
Run Code Online (Sandbox Code Playgroud)