2016-07-10 5 views
0

SPEC

Мне нужно, чтобы выбрать все номера, которые не имеют ни одного дня с saleable = FALSE в указанный период времени (07-09 ~ 07-19):Можно ли преобразовать комплекс SQL в рельсы?

У меня есть таблица номер с 1 строкой за номер.

У меня есть стол room_skus с одной строкой за номер и день (полный комплект для соответствующего временного диапазона).

Столбец ходком является булево NOT NULL и дата определена дата 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

Допустим, у вас есть массив room_ids называется room_ids:

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, как это.

+0

Спасибо за ваш repla, это действительно помогает много Но я думаю, что это будет проблемой, То есть, что номер, который не имеет никаких записей RoomSku на '2016-07-12' Вышеупомянутая комната также должна быть удалена из результата. – user3675188

+0

Я обновил ответ – dsounded

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

Я надеюсь, что это помогает!

+0

Спасибо за ваш repla, это действительно помогает много Но я думаю, что это будет проблемой, То есть, что номер, который не имеет никаких записей RoomSku на '2016-07 -12' Вышеупомянутая комната также должна быть удалена из результата. – user3675188

+0

Можете ли вы пройти здесь именно запрос, порожденный моим ответом? – developer033

Смежные вопросы