【问题标题】:Making posts inactive after a date and time在某个日期和时间后使帖子处于非活动状态
【发布时间】:2017-02-28 12:59:22
【问题描述】:

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

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

对于你们来说,在给定的日期时间过去后使帖子处于非活动状态的最佳方法是什么?这应该是自动的,但我认为不适合使用 Active Job 和 ;

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您只是打算获取和显示帖子,而不是设置布尔值,您可以只为模型添加一个范围:

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

    并像这样使用Post.published

    如果这有帮助,请告诉我。

    更新 1:

    如果您需要确定帖子是否处于活动状态,请像这样向模型添加一个方法,

    def active?
        self.publish_at < Time.now
    end 
    

    【讨论】:

    • 好主意。对于活动帖子,其他功能将可用,例如付款等。我想将活动和非活动帖子保留在同一个表中,并用布尔值区分它们。但是,性能视图是否足以执行以下操作:current_user.posts.published?这将查询数千个帖子并根据范围找到已发布的帖子?
    • 不活跃的帖子会发生什么?无法识别它们。
    • @EnisD。使用布尔列,您仍然需要一个范围来获取值为 true 的那些记录。此外,使用我的方法还有一个额外的好处,那就是避免在特定时间在数据库中设置布尔字段。
    【解决方案2】:

    你可以做一些事情:

    选项 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 为日期时间
    • 如果过期日期的最小单位是一分钟,您需要检查每分钟是否每个未过期帖子都进入过期状态。而且您的服务器可能会过载。

    结论:

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

    【讨论】:

    • 选项 1 现在似乎更合适了。我想我会让用户在创建帖子时指定过期日期和时间,然后将其写入一个名为 expire_at 的字段。当我在视图中列出帖子时,我可以使用这个范围。但还是同一个问题,每个用户每周都会创建大约 10 个帖子。 300 名用户将使用该应用程序,每月将创建 12 000 个帖子。在用户自己删除帖子之前,我永远不会删除它们。从性能的角度来看,这种方式是否足够好?
    • 这取决于,如果您有 100 万条帖子,您不想一次显示所有帖子。在这种情况下,您可能需要使用分页、过滤器等。就数据库而言,它们中的大多数可以存储大量数据而不会降低性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多