Ruby on rails 在某个日期和时间后使帖子处于非活动状态

Ruby on rails 在某个日期和时间后使帖子处于非活动状态,ruby-on-rails,ruby,heroku,rails-activejob,Ruby On Rails,Ruby,Heroku,Rails Activejob,我必须让创建这些帖子的用户在给定的日期和时间后使帖子处于非活动状态。我已经添加了一个布尔字段“published”,以使post处于活动或非活动状态 如果帖子处于活动状态,每个访问者都会看到帖子。如果该帖子处于非活动状态,则该帖子将在用户仪表板中显示为非活动状态 对于你们来说,在给定的日期时间过后,什么是使帖子不活跃的最好方法?这应该是自动的,但我不认为合适的方法是使用主动作业和 检查db中的所有接线柱(如果激活) 如果处于活动状态,请比较给定日期时间和当前日期时间 如果需要,使其处于非活动状

我必须让创建这些帖子的用户在给定的日期和时间后使帖子处于非活动状态。我已经添加了一个布尔字段“published”,以使post处于活动或非活动状态

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

对于你们来说,在给定的日期时间过后,什么是使帖子不活跃的最好方法?这应该是自动的,但我不认为合适的方法是使用主动作业和

  • 检查db中的所有接线柱(如果激活)
  • 如果处于活动状态,请比较给定日期时间和当前日期时间
  • 如果需要,使其处于非活动状态

我使用的是heroku,这会让我的工作人员一直很忙。

如果您只是计划获取和显示帖子,而不是设置布尔值,那么您只需在模型中添加一个作用域即可:

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

如果您只是计划获取和显示帖子,而不是设置布尔值,那么您可以只向模型添加一个范围:

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

你可以做一些事情:

选项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) }
#活动帖子
范围:published,->{where('expired_at>?',Time.now)}
#非活跃职位
范围:未发布,->{where('expired_at<?',Time.now)}
选项2:

如果将属性
发布为布尔值,并且确实需要自动标记,则可以使用

CONS对于此选项:

  • 您将有两个属性表示相同的内容:
    published
    作为布尔值和
    expiration\u datetime
    作为datetime
  • 如果过期日期的最小单位为一分钟,则需要检查每分钟是否每个未过期的post进入过期状态。您的服务器可能会过载
结论:


我建议您选择选项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) }
#活动帖子
范围:published,->{where('expired_at>?',Time.now)}
#非活跃职位
范围:未发布,->{where('expired_at<?',Time.now)}
选项2:

如果将属性
发布为布尔值,并且确实需要自动标记,则可以使用

CONS对于此选项:

  • 您将有两个属性表示相同的内容:
    published
    作为布尔值和
    expiration\u datetime
    作为datetime
  • 如果过期日期的最小单位为一分钟,则需要检查每分钟是否每个未过期的post进入过期状态。您的服务器可能会过载
结论:


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

好主意。对于活跃的帖子,其他功能将可用,如付款等。。我想把活动和非活动的帖子都放在同一个表中,并用一个布尔值来区分它们。但是,对于性能视图来说,这样做是否足够好:current_user.posts.published?这将查询数千篇文章,并根据范围查找已发布的文章?非活动文章会发生什么情况?无法识别它们。@EnisD。对于布尔列,您仍然需要一个作用域来获取那些值为true的记录。另外,使用我的方法还可以避免在特定时间在数据库中设置布尔字段。好主意。对于活跃的帖子,其他功能将可用,如付款等。。我想把活动和非活动的帖子都放在同一个表中,并用一个布尔值来区分它们。但是,对于性能视图来说,这样做是否足够好:current_user.posts.published?这将查询数千篇文章,并根据范围查找已发布的文章?非活动文章会发生什么情况?无法识别它们。@EnisD。对于布尔列,您仍然需要一个作用域来获取那些值为true的记录。此外,使用我的方法还可以避免在特定时间在数据库中设置布尔字段。选项1现在似乎更合适。我想我会让用户在创建帖子时指定过期日期和时间,然后我会将其写入名为expire_at的字段中。当我在视图中列出帖子时,我可以使用这个范围。但还是同样的问题,每个用户每周都会创建大约10个帖子。300名用户将使用该应用程序,每个月将创建12000个帖子。在用户自己删除帖子之前,我永远不会删除它们。从性能的角度来看,这种方式足够好吗?这取决于,如果你有一百万篇文章,你不想一次显示所有的文章。在这种情况下,您可能希望使用分页、筛选等。就数据库而言,大多数数据库可以存储大量数据,而不会降低性能。选项1现在似乎更合适。我想我会让用户在创建帖子时指定过期日期和时间,然后我会将其写入名为expire_at的字段中。当我在视图中列出帖子时,我可以