我对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”的情况看起来非常黑,这就是我的问题所在。如何编写它以不返回任何内容 - 基本上,在这种情况下不添加任何范围?
答案 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
,具体取决于您是否要包含默认范围选择所有车时。