在日期和时间之后使帖子无效

时间:2017-02-28 12:59:22

标签: ruby-on-rails ruby heroku rails-activejob

我要在创建这些帖子的用户在指定的日期和时间之后使帖子无效。我添加了一个布尔字段“已发布”,以使帖子生效或不活跃。

如果帖子处于有效状态,则每位访问者都会看到该帖子。如果它处于非活动状态,则该帖子将在用户仪表板中显示为非活动状态。

对于你们,在给定的日期时间过后,使帖子无效的最佳方法是什么?这应该是自动的,但我认为合适的方式不是使用Active Job;

  • 检查数据库中的所有帖子是否有效,
  • 如果处于活动状态,请比较给定的日期时间和当前日期时间
  • 如果需要,请将其设为无效

我正在使用heroku,所以这会让我的工作人员一直很忙。

2 个答案:

答案 0 :(得分:3)

如果您只是计划获取并显示帖子,而不是设置布尔值,则只需向模型添加范围:

scope :published, -> { where('publish_at < ?', Time.now) }

并像这样使用Post.published

如果有帮助,请告诉我。

更新1:

如果您需要确定帖子是否有效,请向模型添加一个方法,如

def active?
    self.publish_at < Time.now
end 

答案 1 :(得分:1)

你可以做一些事情:

选项1:

根据@ jawad-khawaja的回答,我认为更好的方法是使用expired_at而不是published_at,因为对我来说,发布日期是一个帖子可供人们使用的日期。这样,用户可以为自己的帖子定义过期日期(不是相同的发布日期)。

这里有一些示例,说明如何根据失效日期获得有效/无效的帖子

# active posts
scope :published, -> { where('expired_at > ?', Time.now) }

# inactive posts
scope :unpublished, -> { where('expired_at < ?', Time.now) }

选项2:

如果您有一个属性published作为布尔值,并且您确实需要自动标记它,则选项是使用whenever gem

此选项的

缺点

  • 您将拥有两个代表相同内容的属性:published为布尔值,expiration_datetime为datetime
  • 如果到期日期的最小单位是一分钟,则需要检查每个未过期帖子是否进入过期状态。而且你的服务器可能会过载。

<强>结论:

我推荐的方法是选择选项1.