2011-07-12 9 views
2

テーブルを結合するときに頭が折れるのに問題があります。私は、場所とリストの間にone_to_many関係を持っています。場所には経度と緯度があり、主キーは郵便番号です。リストにはタイトルと郵便番号があります。両方のテーブルで "where"が必要なRoRテーブルの結合

Listing.where("title LIKE ?", "%#{params[:search2]}%") 
Location.where(:lat => @[email protected]_lat, :lon => @[email protected]_lon) 

私は基本的に私は経度と緯度の範囲を使用することによってdetermniedされる郵便番号、与えられた範囲内のすべてのリストを取得することができるように、これらの二つの文を結合したいと思います。私はRuby on Railsでこれを行う方法を理解することができません。ここでは、別のSQLを実行してコード内のデータをループして正しいデータを見つける必要はありません。

編集コードの更新:(エラーになります) "リスト" それは "場所" をやっている理由を私は知らないSELECT "locations".* FROM "locations" INNER JOIN "listings" ON "listings"."location_id" = "locations"."zipcode" WHERE ("locations"."listings" IN ('title LIKE ?', '%fish%')) AND ("locations"."zipcode" = 44012)

、またはIN:。

@results=Location.joins(:listings).where(:listings => ["title LIKE ?", "%#{params[:search2]}%"], :locations => {:zipcode => params[:searchZip]}) 

SQL出力をから来ている。

+0

ロケーションにはリスティングの外部キーがありますか? – eveevans

+0

リストには、場所にリスティングをリンクするための外部キー(location_id)があります。 –

答えて

1

私はLocation has_many :listingsは、このクエリは一致するタイトルの位置範囲内リストのすべて返すことを正しく理解していた場合:

Listing.joins(:location).where(
    'listings.title LIKE ? AND 
    locations.lat BETWEEN ? AND ? AND 
    locations.lon BETWEEN ? AND ?', 
"%#{params[:search2]}%", @min_lat, @max_lat, @min_lon, @max_lon) 
+0

私はより良いRoR/ARelのアプローチを理解しようとしている間、これは一時的な解決策として動作します。ありがとう。 –

0
Location.joins(:listings).where(:listings => {:lat => @[email protected]_lat, :lon => @[email protected]_lon}) 
+1

しかし、それはリストタイトルのどこに組み込まれていません: "タイトルLIKE?"、 "%#{params [:search2]}%" –

+0

それは同じように置くことができます: – eveevans

+0

Location.joins(:リスト:=> {:lat => @min_lat .. @ max_lat、:lon => @min_lon .. @ max_lon}、:locations => {CONDITION}) – eveevans

2

独自のSQLを書くこととは対照的に、私はARELを使用することをお勧めし:

Listing.joins(:location). 
    where(:listings => {:lat => @[email protected]_lat, :lon => @[email protected]_lon}, 
     :location => ["title LIKE ?", "%#{params[:search2]}%"]) 
+0

私はそれを試しましたが、カンマを付けて2番目の検索語を挿入するのと同じくらい簡単だとは思いません。私はSQLの出力を取得しています:( "場所"、 "場所" IN( 'タイトルLIKE%?%'、 '%%'))where句の第2部分から。 –

+0

ああ、私は実際には誤植を持っています( '%'の2つのセットに注意してください)。私は正しい答えを編集しました。 –

+0

コードを更新し、私の継続している問題を更新しました。私は瞬時に簡潔にするために、ちょうど郵便番号に緯度/経度のものを変更しました。 –

関連する問題