2011-07-12 82 views
2

我在加入表格的過程中遇到了麻煩。我在地點和列表之間有一個one_to_many關係。地點有經度和緯度,以及它的主要關鍵:郵政編碼。列表有一個標題和郵編。在兩張桌子上都需要RoR表格加入「where」

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

我基本上喜歡這兩個說法結合起來,這樣我可以一個郵政編碼,這是通過使用一系列經度和緯度的determnied給定的範圍內得到的所有信息。我無法弄清楚如何在Ruby on Rails中以這種方式做到這一點,我不需要單獨執行SQL查找並循環查看代碼中的數據以找到正確的數據。

編輯更新代碼:

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

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來自。

+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

但這並沒有納入列表標題: 「title LIKE?」,「%#{params [:search2]}%」 –

+0

這是相同的>你可以這樣說: – eveevans

+0

Location.joins(: (:listing listings => {:lat => @min_lat .. @ max_lat,:lon => @min_lon .. @ max_lon},:locations => {CONDITION}) – eveevans

2

我建議使用AREL,而不是寫你自己的SQL :

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

我試過了,我不認爲這很簡單,只需添加一個逗號並插入第二個搜索詞。我從where子句的第二部分獲取SQL輸出:(「locations」。「locations」IN('title LIKE%?%','%%'))。 –

+0

啊哈,我實際上有一個錯字(注意兩組'%')。我編輯了我的答案是正確的。 –

+0

我更新了代碼頂部和我的繼續問題。爲了簡單起見,我將經緯度變更爲郵政編碼。 –