2011-01-07 4 views
14

私はちょうど.whereメソッドの使用を開始しました。これを完全に活用する方法についてちょっと混乱します。Rails3の.whereメソッドを使用する

私のような何かをしたいと思います:

@books = Book.where(:author_id => 1 || 2) 

は明らかに私はそれが動作しません知っているが、私はここにいくつかの余分なロジックをしたいということを証明しようとしています。いくつかの "または" "と"等しくない "など。

私はこれをどこで調べることができますか?私は、レールAPIを見ていたが、私は役に立たなかった何かを見なかった。

ありがとうございます!

答えて

26

1 || 2は動作しませんので、それはBook.where(:author_id => 1)と同等である必要があり、私はどうなる:。

@books = Book.where(:author_id => [1, 2]) 

生成されたSQLがWHERE author_id IN (1, 2)

になります。
+0

ねえカムを行うだろう!どのように私がどこで、または "と"または "等しくない"タイプのロジックを達成するための別の方法を使用することができますどのようなアイデア? – Elliot

+0

Hey Elliot、残念なことに、 'where'のハッシュ引数はタイプクエリと同じではありません(http://guides.rubyonrails.org/active_record_querying.html参照)。「等号、範囲、サブセットのチェックのみ可能です。ハッシュ条件 ")。 "and."クエリが実行される限り、あなたのハッシュに別のキーを追加するだけです: 'Book.where(:author_id => [1、2]、:bestseller => true)'は 'WHERE author_id IN(1、 2)ANDベストセラーは真です) ' – cam

+0

モンゴイドのためにどのように修正すべきですか? –

3

ソース(無まともなドキュメント!)を見ると、あなたがのためのSQLのようにパラメータ化することができ、SQLを通過することができます:あなたのような何かを行うことができますので、条件等は、:

@books = Book.where("author_id = 1 OR author_id = 2") 

ありません理想的なSQLにドロップダウンするが、私はよりエレガントな方法を使用してそれを行うには見ることができません。

Source and absence of documentation here

+0

私は '@books = Book.where( "AUTHOR_ID =?OR AUTHOR_ID =?"、1、2)大きな感謝を働いた' – DemitryT

4

MetaWhere、https://github.com/ernie/meta_whereを見 - これはかなりきちんとそういったことを可能にする:)その式が評価されているため、関数呼び出し(それは1と評価された前

1

Arelをもっと複雑なものにしたいと思うかもしれません。それはすでにRails 3に組み込まれています(ARは内部でそれを使用します)。

book = Book.arel_table 
# range 
Book.where(book[:author_id].gt(0).and(book[:author_id].lt(3)) 

#or 
Book.where(b[:author_id].eq(0).or(t[:author_id].eq(3).order(:first_name)) 

#joins 
book.join(authors).on(book[:author_id].eq(author[:id])). 
    where(book[:title].matches 'hokum n stuff') 

グループ別、集計などもあります。欠点はドキュメントが疎であることです。 docs

tests

関連する問題