I持って次のクエリネストされたSQLクエリ
@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry])
私は、それぞれが行う使用して上記のクエリからの選択に別のSQLクエリを実行することができます方法はありますか?ジオキット計算を実行して、特定の距離外にある特定のリストを削除したいと考えています。
I持って次のクエリネストされたSQLクエリ
@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry])
私は、それぞれが行う使用して上記のクエリからの選択に別のSQLクエリを実行することができます方法はありますか?ジオキット計算を実行して、特定の距離外にある特定のリストを削除したいと考えています。
あなたの質問はちょっと混乱しています。あなたは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
に割り当てる必要があります。コントローラーのインスタンス変数(ローカルのものとは対照的)のみがビューにアクセスできるからです。
要するに、これは、最初の問合せの後にリレーショナル表またはビューが残っていないため、activerecordオブジェクトの配列が残っているためです。したがって、最初のクエリの後に実行される処理は、sqlではなくrubyとactiverecordの形式でなければなりません。
distance_fromがルビ関数であるため、 'WHERE location1.distance_from(location2、:units =>:miles)<50'でSQLでこれを行うことができないという問題があります。 – Lisa
Ha申し訳ありません - 事故によって突入する。 – Lisa
私の編集を参照してください。しかし、もう少し具体性はまだまだ長い道のりになるだろう。元の投稿を参照して、location1とlocation2は何ですか? – diedthreetimes