用于查找不同时间段发布的已完成记录的SQL查询



所以假设有一个博客,所有者可以在不同的时间段发布他的帖子,例如:

  • 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 

最新更新