2013-05-23 19 views
11

これは他の何よりもRubyの構文のほうが多いかもしれません。私はSomeObject.findに2つの制限条件を得るのが難しいです。別居Rails ActiveRecord:複数の条件で検索する

、条件が動作するようです:

if search != '' 
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"]) 
else 
    find(:all, :conditions => ['active', 1]).shuffle 
end 

私は最初のケースのためにのためにつもりはこれです:

find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1]) 

しかしラインはsyntax error, unexpected ')', expecting tASSOCをスローします。 active = 1にチェックするために冗長性を伴うだろう代わりにif-elseを使用しての

答えて

16

レール2

find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1])メソッドにハッシュを通過させるための適切な構文ではありません。メソッドの最後の引数であれば、中括弧をハッシュから離れることができますが、この場合、最後の引数として配列を渡しています。

代わりに以下を使用します

find(:all, :conditions => ["name LIKE ? AND active = ?", "%#{search}%", 1]) 

または

params = {:search => "%#{search}%", :active => 1} 
find(:all, :conditions => ["name LIKE :search AND active = :active", params]) 

レール3と4

あなたはおそらく、より最近のRailsのバージョンについては、次のような何かをしたいと思うが。

scope :active, -> { where(active: true) } 
scope :name_like, ->(search) { where("name LIKE ?", "%#{search}%") } 

そして、あなたはこのようにそれを呼びたい:あなたはアプリケーション全体でさまざまな組み合わせでそれらの特定のクエリを再利用することができます

YourModel.active.name_like("Bunnies") 

。また、コードを読みやすくするためにスーパーデータを検索します。あなたがscope構文が気に入らない場合は

、あなたはまた、クラスメソッドとしてこれらを定義することもできます。その場で

def self.active 
    where(active: true) 
end 

def self.name_like(search) 
    where("name LIKE ?", "%#{search}%") 
end 

することもできますチェーンスコープ。これにより、関係オブジェクトの連鎖を構築し、条件に基づいて他のものを組み込むことができます。ここでは、同じ結果を達成するために、元の質問に適用された場合、それは次のようになります:

results = active 
results = results.name_like(search) if search.present? 
+0

ありがとうございました!あなたの2番目の例は私のために働いた(最初の試みはしませんでした - 2番目の方法はいくつかの条件を追加する良い方法のように見えるので、あまり順序を心配する必要はありません)。 –

2

は、簡単な構文はこのようなものになるだろう:

result = where(:active => 1) 
result = result.where('name like ?', "%#{search}%") unless search.blank? 

限り、あなたのシーイングが、原因であると表示されませんエラーとしてあなたが掲示しているコードによって。スタックトレースは、あなたがこれを試して、レール2

を使用している私が思う...それをさらに絞り込む

+0

を導入している私はここに停止した場合うん、それは一種の冗長になるが、私は何の検索文字列が入力されていない場合にのみ結果をシャッフルするようなことをしたいと私は追加条件を追加したいです/この礎の上にあるステートメント。ご回答有難うございます! –

2

を助けるかもしれません。

find(:all, :conditions => ['name LIKE ? and active = 1', "%#{search}%"]) 

レール3構文

where('name LIKE ? and active = 1', "%#{search}%") 
+0

私はRails 3を使用していますが、2007年のチュートリアルから元の検索スニペットが得られました:http://railscasts.com/episodes/37-simple-search-form –

0

Railsの4のために、では新しいfind_byとfind_byレール!方法は

Read answer