2011-07-26 12 views
0

I持って次のクエリネストされたSQLクエリ

@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry]) 

私は、それぞれが行う使用して上記のクエリからの選択に別のSQLクエリを実行することができます方法はありますか?ジオキット計算を実行して、特定の距離外にある特定のリストを削除したいと考えています。

答えて

0

あなたの質問はちょっと混乱しています。あなたはeach..do(ruby)を使ってフィルタリングをしますか?または、SQLクエリを使用しますか?ここではあなたがあなたのListing.find_by_sql呼び出しに(多分サブ選択)あなたは、単に追加のSQLを追加することができ、それをSQLを使用したい場合はルビープロセスはフィルタリング

refined list = @initial_matches.map { |listing| 
    listing.out_of_bounds? ? nil : listing 
}.comact 

をやらせることができる方法です。

あなたのコメントであなたが言うようにしたい場合。

WHERE location1.distance_from(LOCATION2、:単位=>:キロ)

あなたはルビー(location1.distance_from(location2, :units=>:miles))とSQL(WHERE X > 50)を混合しています。これは困難ですが、不可能ではありません。

しかし、ルビで距離計算をしなければならない場合は、そこにもフィルタリングをしないでください。それで私の最初の例の精神で。

listing2 = some_location_to_filter_by 
@refined_list = @initial_matches.map { |listing| 
    listing.distance_from(listing2) > 50 ? nil : listing 
}.compact 

これは、50を超えるものだけを所定のリストから維持しながら、すべてのリストを繰り返します。

EDIT:コントローラーでこのロジックが実行されている場合は、refined_listの代わりに@refined_listに割り当てる必要があります。コントローラーのインスタンス変数(ローカルのものとは対照的)のみがビューにアクセスできるからです。

+0

distance_fromがルビ関数であるため、 'WHERE location1.distance_from(location2、:units =>:miles)<50'でSQLでこれを行うことができないという問題があります。 – Lisa

+0

Ha申し訳ありません - 事故によって突入する。 – Lisa

+0

私の編集を参照してください。しかし、もう少し具体性はまだまだ長い道のりになるだろう。元の投稿を参照して、location1とlocation2は何ですか? – diedthreetimes

0

要するに、これは、最初の問合せの後にリレーショナル表またはビューが残っていないため、activerecordオブジェクトの配列が残っているためです。したがって、最初のクエリの後に実行される処理は、sqlではなくrubyとactiverecordの形式でなければなりません。

関連する問題