#ruby-on-rails #associations
#ruby-on-rails #ассоциации
Вопрос:
class Desk < ApplicationRecord
has_many :reservations, dependent: :destroy
end
и
class Reservation < ApplicationRecord
belongs_to :desk
end
Я хочу получить все столы на дату, когда они не зарезервированы таким образом:
@free_desks = desks.select{|desk| desk.reservations.where.not(date: date)}
Итак, когда у меня есть 8 столов, например, и на дату «2020-09-06» стол (id: 1) зарезервирован в модели резервирования в качестве записи, я хочу вернуть 7 столов.
Но это не работает. Кто-нибудь может мне помочь?
Спасибо, ребята
Ответ №1:
Итак, вы хотите, чтобы все столы, у которых нет соответствующих резервирований?
Попробуйте это:
Desk.left_joins(:reservations).where(reservations: {id: nil})
Что это значит?
Вы можете думать о нас как о попытке объединить две таблицы вместе. Мы перечисляем все диалоги, но у некоторых из них не будет никаких сообщений: идентификаторы будут равны нулю. Мы хотим их получить — следовательно, мы используем метод запроса активной записи ‘where’.
Предупреждения
Вы можете получить миллион таких записей, которые могут вас ошеломить. Будьте осторожны, если вы попытаетесь перебрать их все за один раз.
Обновленный вопрос:
date = Date.parse('january 5 2013')
Desk.left_joins(:reservations).where(reservations: {id: nil, date: date.beginning_of_day..date.end_of_day})
Примечание: Это, скорее всего, предполагает время UTC (при условии, что вы не изменили никаких настроек по умолчанию).
Комментарии:
1. Большое вам спасибо, я попробую
2. Но он не фильтрует по дате. Пробовал это: Desk.left_joins(: резервирование). где.нет(оговорки: { дата: date}) Но в настоящее время не работает. Я пытаюсь выяснить
3. Я хочу, чтобы все столы, у которых нет резервирования на определенную дату
4. @MrGrashopper — это совершенно новый вопрос! В stack overflow вы не должны полностью изменять вопрос подобным образом. Следует либо задать полный вопрос заранее, либо задать совершенно новый вопрос
5. Извините, но в моем вопросе я упомянул об этом: «Я хочу получить все столы на дату, когда они не зарезервированы таким образом …»