所以假设有一个博客,所有者可以在不同的时间段发布他的帖子,例如:
- 1周
- 2周
- 1个月
- 2个月
- 6个月
之后该帖子应该被删除。
时间段设置在名为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
方法),并检查每个记录是否符合要求
我可能会选择第二个,但我只是想知道是否有一种有效的方法可以为这种情况编写查询?也许是一些数据库函数之类的?
如果我这样做,那么为了我自己的理智,我会添加一个日期/日期时间字段来存储实际到期时间,您可以简单地将其与当前时间进行比较,以查看帖子是否已过期。这将通过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
现在,您只需在数据库中查看哪些帖子已经过期。保持简单。
我同意@a_hors_with_no_name的观点。然而,如果这不是一个选项,你可能可以做一些类似的事情:
where created_at <= case time_period when 0 then :one_week_ago
when 1 then :two_weeks_ago
...
end