在Ruby on Rails中组合IF语句中的范围

时间:2012-07-15 23:21:15

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord scope

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

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

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

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

1 个答案:

答案 0 :(得分: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])