RoR表连接两个表所需的“where”

时间:2011-07-12 20:17:35

标签: sql ruby-on-rails ruby-on-rails-3 activerecord

我在连接桌子时遇到了麻烦。我在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来自哪里。

3 个答案:

答案 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} )