为Rails应用程序存储全局状态的最佳方法是什么?

时间:2015-08-17 14:27:57

标签: ruby-on-rails

我有一个Rails应用,主持人可以管理meetings,普通users可以参加这些会议。

在某些时候,管理员应该能够"半冻结"该应用程序。这基本上是设定一段时间(让我们称之为"冻结时期"),在此期间会发生一些事情:

  • 由于在冻结期开始之前创建的会议将很快包含在计算中,因此在冻结期间不能edit
  • 主持人可以继续create次新会议和edit次会议,因为这些新会议不会影响计算。
  • 网站周围出现了
  • 警告,解释了这些问题。

原则上我可以创建一个FrozenPeriod模型,但我实际上并不需要一次存储几个冻结时段,因为它们一旦结束就会被丢弃。

因此,我正在寻找一个全球状态"类型方法。这应该仍然存储在数据库中,但可能没有相关的模型。

这有意义吗?最佳实践包括一种拥有单身模型的方法"存储在数据库中,例如?

2 个答案:

答案 0 :(得分:2)

创建模型以将此设置保存到,并在迁移中仅创建1条记录:

class CreateFrozenPeriod < ActiveRecord::Migration
   def change
    create_table :frozen_periods do |t|
      t.boolean :active
    end
   end
  # create 1 record to store settings to.
  FrozenPeriod.create
end

使用此模型作为单身来设置和获取值:

class FrozenPeriod 
   def self.active?
      FrozenPeriod.first.active
   end

   def self.active= val 
     FrozenPeriod.first.update_column(:active, val)
   end
end

您也可以使用与上述相同的Rails Settings Cached,并且可以扩展带有设置的模型。

答案 1 :(得分:1)

我认为拥有具有以下属性的FreezePeriod模型将是一个很好的设计:

  • 起始日期
  • END_DATE

然后,您可以编写逻辑来检查当前是否存在活动的冻结期。

使用此方法可以保留冻结期的历史记录,并且您还可以在将来安排冻结。