我有一个名为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天内等。)
这甚至可能吗?我需要某种形式的加入吗?
答案 0 :(得分:3)
scope :expired, lambda { |retainer| where("posts.created_at < ?",
Time.now - retainer) }
然后就像使用它一样:
Post.expired(post.category.retainer)
或者来自类别模型:
def Posts
Post.expired(retainer)
end