我需要在请求的时间段saleable = FALSE
内选择所有没有(07-09 ~ 07-19)
天的房间:
我有一间餐厅,每个房间有一排。
我有一个table room_skus,每个房间和每天有一行(相关时间范围的完整设置)。
列salable是boolean NOT NULL,date定义为date NOT NULL
SELECT id
FROM room r
WHERE NOT EXISTS (
SELECT 1
FROM room_skus
WHERE date BETWEEN '2016-07-09' AND '2016-07-19'
AND room_id = r.id
AND NOT saleable
GROUP BY 1
);
上面的SQL查询正在运行,但我想知道如何将其转换为Rails ORM。
答案 0 :(得分:2)
我们假设您有一组名为room_ids
的room_id:
needed_room_ids = room_ids - RoomSku.where(room_id: room_ids, date: '2016-07-09'..'2016-07-19', sealable: false).pluck(:room_id)
如果您的room_sku
模型被称为RoomSku
更新版本:
room_ids = Room.all.select { |record| record.room_skus.present? }.map(&:id)
然后:
needed_room_ids = room_ids - RoomSku.where(room_id: room_ids, date: '2016-07-09'..'2016-07-19', sealable: false).pluck(:room_id)
它不会是一个查询,但你可以避免像这样的普通SQL。
答案 1 :(得分:1)
我这里没有任何项目来测试类似的东西,但它应该可以工作:
Room.where.not(id: RoomSku.where(date: DateTime.parse('2016-07-09').strftime("%Y-%m-%d")..DateTime.parse('2016-07-19').strftime("%Y-%m-%d"), saleable: false).pluck(:room_id))
我希望它有所帮助!