所以想象有一个博客,所有者可以在不同的时间段内发布他的帖子,例如:
之后应该删除帖子。
时间段在名为time_period
的列中设置,其中包含整数值,其中0
代表1周,1
代表2周等等
创建日期在created_at
列中设置。
所以我需要编写一个sql查询来获取所有已过期的发布日期的记录,我有两种方法可以解决这个问题:
1)编写一个包含很多条件的查询:
.where("(time_period = 0 AND created_at <= :one_week_ago) OR
(time_period = 1 AND created_at <= :two_weeks_ago)",
one_week_ago: Time.now - 1.week,
two_weeks_ago: Time.now - 2.weeks)
但适用于所有条件
2)或者只是获取所有记录(使用find_each
方法)并检查每个记录是否符合要求
我可能会选择第二个,但我只是想知道是否有一种有效的方法来为这种情况编写查询?也许某些数据库函数或类似的东西?
答案 0 :(得分:1)
我同意@a_horse_with_no_name。但是,如果这不是一个选项,您可以执行以下操作:
where created_at <= case time_period when 0 then :one_week_ago
when 1 then :two_weeks_ago
...
end
答案 1 :(得分:1)
如果我这样做,那么为了我自己的理智,我会添加一个日期/日期时间字段来存储实际的到期时间,您可以简单地将其与当前时间进行比较,以查看帖子是否已过期。这将通过before_save回调中的time_period选项进行设置。
class Post
before_save :set_expiry_date
def set_expiry_date
self.expiry_date = self.calculate_expiry_date
end
def calculate_expiry_date
#logic which takes time_period and multiplies it by weeks or whatever you do
end
现在您可以查看数据库并查看哪些帖子已过期。保持简单。