Рубин на рельсах. Обновите атрибут, когда дата пройдет

Я чувствую, что это очень нубский вопрос, но здесь идет.

У меня есть модель (гигабайт) с атрибутом 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)
Другие вопросы по тегам