我在连接桌子时遇到了麻烦。我在Locations和Listings之间有一个one_to_many关系。位置具有经度和纬度,以及它的主键:zipcode。列表有标题和邮政编码。
Listing.where("title LIKE ?", "%#{params[:search2]}%")
Location.where(:lat => @min_lat..@max_lat, :lon => @min_lon..@max_lon)
我基本上喜欢将这两个语句结合起来,以便我可以在一个给定的邮政编码范围内获得所有列表,这可以通过使用一系列经度和纬度来确定。我无法弄清楚如何在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 :(得分:2)
我建议使用ARel而不是编写自己的SQL:
Listing.joins(:location).
where(:listings => {:lat => @min_lat..@max_lat, :lon => @min_lon..@max_lon},
:location => ["title LIKE ?", "%#{params[:search2]}%"])
答案 1 :(得分: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)
答案 2 :(得分:0)
Location.joins(:listings).where(:listings => {:lat => @min_lat..@max_lat, :lon => @min_lon..@max_lon} )