2009-04-25 9 views
2

Ruby on Railsを習得し始めたばかりで、この質問に対する答えを見つけることができませんでした。Ruby on RailsでOR SQL検索を実行するにはどうすればよいですか?

Iは、次のコードた: - :

@products = Product.find(:all, 
    :conditions => ["productsubtype_id = ?", @productsubtypes], 
    :order => "name") 

@productsubtypesは(現在、このものと、ほぼ同じ別のSQLクエリから2つのオブジェクトを含む)の配列であるが、それが生成するSQLは、以下であります

SELECT * FROM `products` WHERE (productsubtype_id = 2,3) ORDER BY name 

私は次のSQLコード(またはそれに近いもの)を生成するためにオリジナルのRubyコードを変更する方法を見つける必要があります:

SELECT * FROM `products` WHERE (productsubtype_id = 2 
    OR productsubtype_id = 3) ORDER BY name 

元のコードを変更して必要な処理を行う方法はありますか、間違ったトラックを完全に間違っているのですか?あなたの助けのための

おかげで、

フアン

答えて

1

conditions_fuプラグインを使用してみてください。

Product.all(:conditions => { :productsubtype_id.in => @productsubtypes }, 
:order => "name") 
+0

ありがとうございました - conditions_fuは私が探していたものです。 –

1

@products = Product.find(:すべて、

:=>「名前順:条件は=>、

[、@productsubtypes "?IN() productsubtype_id"]を")

+1

私はsqliteを使用しており、 "productsubtype_id IN(?)"が必要です。 – klew

+1

これはテスト時に働いた答えをありがとう、私はちょうど(?)を使用しなければならなかった –

3

これらのソリューションはどちらも機能しますが、ActiveRecordには、条件ハッシュを使用するときに配列または単一のIDを渡すかどうかを知るためのビルトインサポートが既に組み込まれています。例:

User.all(:conditions => {:id => [1,2,3]}) 

は、あなたのいずれかの条件にSQLを渡すか(プラグインを使用する必要があります、しかし、あなたはより複雑なクエリのための

@products = Product.find(:all, 
    :conditions => {:productsubtype_id => @productsubtypes}, 
    :order => "name") 

を望むクエリので

SELECT * FROM `users` WHERE (users.`id` IN(1,2,3)) 

を生成し、 ie conditions_fu)

1

また、IN対EXISTSの使用を考慮する必要があります。 IN内で使用しているサブセットが非常に大きい場合は、EXISTSを使用する方が良いかもしれません。基本的に、1つは結合を使用し、もう1つは結合を使用しません。

関連する問題