2011-01-20 8 views
0

私のアプリに基づいて、私は条件のセットに基づいてユーザーをつかむ必要があります。rails - ビルドクエリ、それらを組み合わせる?

@usersSet1 = XXX based on a bunch of conditions 

@usersSet2 = XXX based on a bunch of different conditions 

@usersSet3 = XXX based on a bunch of even more different conditions 

私は3を結合し、上位100個のレコードを取ります。これをRailsでやってみようと思っていますか?ありがとう

+0

どのように組み合わせたいですか?追加、注文、何? – Jimmy

答えて

3

あなたは、モデル内のスコープを定義する必要があります。

# model 
scope :set1, where(some_conditions), ... 
scope :set2, where(some_conditions), ... 
scope :set3, where(some_conditions), ... 
scope :top_100, limit(100) 

は、それらのスコープに適切な名前を付けます。もちろん、orderに何か必要があります。 は、次に、あなたが呼び出すことができます。

@usersSet1 = User.set1 
@usersSet2 = User.set2 
@usersSet3 = User.set3 

@usersset123 = User.set1.set2.set3.top_100 

それANDますSET1、SET2、およびSET3のすべての条件。

+0

これはとても涼しいです!ありがとう – AnApprentice

+0

それは鎖であることを知りませんでした – jschorr

+0

各スコープがSQLに追加されているので、これはうまくいきません。SET 1 = XXX、AND 2 = x、AND 3、私が必要とするものは、ORではない。アイデア? – AnApprentice

-1

最も良い方法は、これらの条件を持つフィールドを取り戻す1つのSQLクエリを実行することです。例:

@users = User.all(select => "city,state,last_name,first_name,…", :limit => 100) 

ここでは、すべての列があります。だからあなたは次へ進む:

@usersSet1 = @users.select{|a| a.state == 'Charlotte' && a.state == 'NC') #pulls back users in Charlotte 
@usersSet2 = @users.select{|b| b.last_name == 'Smith' } #pulls back users that have the last name of Smith. 
@usersSet3 = @users.select{|b| b.first_name == ('John' || 'Joe') } #pulls back users that have the first name of John or Joe. 

など...これは、私の意見では、はるかにスケーラブルです。

+0

ありがとうございますが、ここで問題となるのは、各クエリがロジックの別のテーブルを必要とすることです。 – AnApprentice

+0

申し訳ありませんが、私は誤解しました。 – jschorr

関連する問題