Rails范围 - 我不希望在某些条件下添加任何范围

时间:2012-07-05 15:43:40

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

我对Rails有点新,并且一直在使用Rails 3.2中的范围。我喜欢范围如何从控制器中分离出代码。但是,当我使用作用域构建查询时,我无法弄清楚如何在某些情况下添加作用域。请参阅下面的示例...

在我的CarsController类中

    if !params[:make_name].blank?  
        @cars = Car.by_make(params[:make_name]).find(:all, :group => "name")
    else      
        @cars = Car.all

在我的汽车模型课上。代码试图说“如果make_name字符串是'all',那么 在其上添加任何条件,否则添加条件。”

def self.by_make(make_name_str)
    if make_name_str == "all"
        where("cars.id > ?", 0)
    else
        make_id = Make.where(:name => make_name_str).first.id
        where(:make_id => make_id)
    end
end

显然字符串是“all”的情况看起来非常黑,这就是我的问题所在。如何编写它以不返回任何内容 - 基本上,在这种情况下不添加任何范围?

1 个答案:

答案 0 :(得分:0)

Car模型中尝试此操作:

class Car < ActiveRecord::Base
  ...
  scope :by_make, lambda do |make|
    make == :all ? scoped : where(:make_id => Make.where(:name => make).first.id)
  end
end

注意如果Car模型中存在默认范围,您可能需要考虑在上面的代码中使用unscoped,具体取决于您是否要包含默认范围选择所有车时。