Рубин на рельсах. Обновите атрибут, когда дата пройдет
Я чувствую, что это очень нубский вопрос, но здесь идет.
У меня есть модель (гигабайт) с атрибутом datetime (дата) и логическим атрибутом с истекшим сроком (истек).
Я хочу, чтобы истекшее логическое значение было установлено в true, когда дата и время проходят сегодня.
В Gig модель:
def expired
if self.date.to_date > Date.today
self.update(:expired, true)
end
end
не работает Ни один не делает:
def expired
if self('date < ?', Date.today)
self.update_attribute(:expired, true)
end
end
Я чувствую, что это должно быть очень просто, но я не могу найти много информации по этому вопросу.
2 ответа
Это важно знать цель логического. Если ваша цель состоит в том, чтобы иметь возможность создать свойство для использования в местах, где запросы по всему коду (например, получение всех просроченных концертов), тогда хорошим вариантом может стать область действия. Просто добавьте этот код в вашу модель Gig:
scope :expired, -> { where('date < ?', Time.current.beginning_of_day) }
Затем вы можете получить все просроченные концерты, написав:
Gig.expired
Тогда вам вообще не нужен истекший логический тип. Если вы используете свой текущий метод, вы должны будете использовать фоновый процесс для ежедневной установки устаревших логических значений. См. http://guides.rubyonrails.org/active_record_querying.html для получения дополнительной информации об использовании областей.
Создайте грабли и запускайте их каждый день в 23:59 (или в любое другое время).
Gig.where('date < ?', Date.today).update_all(expired: true)