Данные ассоциации в объеме модели рельсов

У меня есть модель по имени Post (сообщение в блоге) и модель с именем Category, Каждый пост belongs_to категория. Каждая категория имеет атрибут с именем retainer который определяет количество времени до истечения срока действия сообщения, например, movies_category.retainer = 30.days

То, что я пытаюсь сделать, это создать пространство для Post который находит все сообщения, которые "просрочены". Так, например, предполагая, что я должен был жестко закодировать значение 30.days и он должен был применяться ко всем категориям (следовательно, ко всем сообщениям), охват будет:

scope :expired, lambda { where("posts.created_at < ?", 30.days.ago) }

Тем не менее, вместо жесткого кодирования значение 30.days.agoЯ хочу получить retainer значение из категории поста и основывать условие на этом, так что-то вроде:

scope :expired, lambda { where("posts.created_at < ?", 
  Time.now - post.category.retainer) }

Итак, говоря словами: я хочу получить все посты, срок действия которых истек, а статус истечения определяется значением сохранителя для каждой категории (т. Е. Срок действия постов в категории фильмов истекает через 10 дней, срок постов в категории игр истекает через 5 дней)., так далее.)

Это вообще возможно? Нужна ли мне какая-то форма соединения или что-то в этом роде?

1 ответ

Решение
scope :expired, lambda { |retainer| where("posts.created_at < ?", 
  Time.now - retainer) }

Тогда просто используйте это как:

Post.expired(post.category.retainer)

Или из категории модели, как:

def Posts
  Post.expired(retainer)
end
Другие вопросы по тегам