是否可以将复杂的SQL转换为rails?

时间:2016-07-10 05:35:34

标签: ruby-on-rails

SPEC

我需要在请求的时间段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。

2 个答案:

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

我希望它有所帮助!