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

明らかに、文字列が「すべて」の場合は非常にハッキングされているように見え、それが私の質問です。何も返さないようにするにはどうすればよいですか - 基本的に、この状況ではスコープを追加しないでください。

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 に答える