1

我正在尝试为搜索表单创建范围字符串。我可以用范围构建这样的东西吗:

scopestring = Product.all 
if params[:price].include? 
  scopestring = scopestring + '.free'
if params[:location].include? 
  # same for location 
end 

显然我不能这样做,但是有没有办法做类似的事情。有什么建议么?不喜欢 9 个条件 IF 或案例语句来处理搜索页面上的各种过滤器。

如果我在这里完全走错了方向,那么在 Rails 中处理长条件语句的最佳方法是什么?我宁愿远离宝石。

4

1 回答 1

2

首先,Product.all它不是作用域,它实际上进行搜索。你想要的是Product.scoped. 返回的范围是一个对象,而不是一个字符串。假设这:free是一个范围:

products = Product.scoped
if params[:price] == "free"  #your example of include? doesn't make sense
  products = products.free
end

您可以通过重构模型进一步简化它:

class Product < ActiveRecord::Base
  scope :free, lambda {|free| free.nil? ? {} : where(:price => 0)}
end

然后在你的控制器中:

@products = Product.free(params[:price])
于 2012-07-15T23:27:28.297 回答