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

时间:2015-04-10 07:16:44

标签: sql ruby-on-rails database postgresql

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

  • 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方法)并检查每个记录是否符合要求

我可能会选择第二个,但我只是想知道是否有一种有效的方法来为这种情况编写查询?也许某些数据库函数或类似的东西?

2 个答案:

答案 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

现在您可以查看数据库并查看哪些帖子已过期。保持简单。