0

我对 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”的情况看起来很黑,这就是我的问题所在。我如何编写它以不返回任何内容 - 基本上,在这种情况下不要添加任何范围?

4

1 回答 1

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在上面的代码中使用,具体取决于您在选择所有汽车时是否要包括默认范围。

于 2012-07-05T17:12:24.877 回答