首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails左连接并包含不存在的左表记录

rails左连接并包含不存在的左表记录
EN

Stack Overflow用户
提问于 2014-02-24 03:20:55
回答 1查看 146关注 0票数 0

我正试图通过rails AR查询接口实现一个“真正的”左连接,但我不知道如何做到这一点,这需要急切地加载...

我能够通过AR接口生成以下查询

代码语言:javascript
复制
scope :user_search, lambda {|user_id| includes(:trip_item).where("trip_items.user_id = ? OR trip_items.user_id IS NULL", user_id).order("trip_items.updated_at desc") }

apartments = Apartment.where(:location_id => near_by_locations.map(&:id).uniq)

    apartments = apartments.where.not(:id => exclude) unless exclude == nil

    apartments = apartments.where("apartments.updated_at >= :date", :date => 20.days.ago)
    apartments = apartments.where("apartments.price >= ?", search.min_price)
    apartments = apartments.where("apartments.price <= ?", search.max_price) unless search.max_price == nil
    apartments = apartments.where("apartments.rooms >= ?", search.min_rooms)
    apartments = apartments.where("apartments.rooms <= ?", search.max_rooms) unless search.max_rooms == nil


    apartments = apartments.order("apartments.updated_at DESC").user_search(user_id)

 SELECT * FROM "apartments" 
 LEFT OUTER JOIN "trip_items" ON "trip_items"."apartment_id" = "apartments"."id"
 WHERE "apartments"."location_id" IN (1, 8, 11, 13, 12, 7) AND ("apartments"."id" NOT IN (27, 8)) 
 AND (apartments.updated_at >= '2014-02-03 19:02:11.609227') AND (apartments.price >= 100) 
 AND (apartments.price <= 5000) AND (apartments.rooms >= 1.0) 
 AND (trip_items.user_id = 1 OR trip_items.user_id IS NULL) 
 ORDER BY apartments.updated_at DESC, trip_items.updated_at desc

但是我需要以下代码来返回空的左表记录:

代码语言:javascript
复制
 SELECT * FROM "apartments" 
 LEFT OUTER JOIN "trip_items" ON "trip_items"."apartment_id" = "apartments"."id" AND trip_items.user_id = 1
  WHERE "apartments"."location_id" IN (1, 8, 11, 13, 12, 7) AND ("apartments"."id" NOT IN (27, 8)) 
 AND (apartments.updated_at >= '2014-02-03 19:02:11.609227') AND (apartments.price >= 100) 
 AND (apartments.price <= 5000) AND (apartments.rooms >= 1.0) 
 ORDER BY apartments.updated_at DESC, trip_items.updated_at desc

感谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2014-02-24 04:08:15

首先,为什么这行出现了两次?

代码语言:javascript
复制
apartments = apartments.where("apartments.rooms <= ?", search.max_rooms) unless search.max_rooms == nil

不管怎样,使用这个

代码语言:javascript
复制
 apartments = Apartment.where(:location_id => near_by_locations.map(&:id).uniq) 
 apartments = apartments.where.not(:id => exclude) unless exclude == nil
 apartments = apartments.where("apartments.updated_at >= :date", :date => 20.days.ago) 
 apartments = apartments.where("apartments.price >= ?", search.min_price) 
 apartments = apartments.where("apartments.price <= ?", search.max_price) unless search.max_price == nil
 apartments = apartments.where("apartments.rooms >= ?", search.min_rooms) 
 apartments = apartments.includes(:trip_items).where("trip_items.user_id = ?", user_id)
 apartments = apartments.order("apartments.updated_at DESC ,trip_items.updated_at desc")

这将生成以下内容

代码语言:javascript
复制
SELECT * FROM "apartments" 
WHERE "apartments"."location_id" IN (1, 8, 11, 13, 12, 7)
AND ("apartments"."id" NOT IN (27, 8)) 
AND (apartments.updated_at >= '2014-02-03 19:02:11.609227') 
AND (apartments.price >= 100) 
AND (apartments.price <= 5000) AND (apartments.rooms >= 1.0) 
LEFT OUTER JOIN "trip_items" ON "trip_items"."apartment_id" = "apartments"."id" AND trip_items.user_id = 1
ORDER BY apartments.updated_at DESC, trip_items.updated_at desc 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21973254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档