Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为Rails应用程序存储全局状态的最佳方法?_Ruby On Rails - Fatal编程技术网

Ruby on rails 为Rails应用程序存储全局状态的最佳方法?

Ruby on rails 为Rails应用程序存储全局状态的最佳方法?,ruby-on-rails,Ruby On Rails,我有一个Rails应用程序,其中主持人可以管理会议,普通用户可以参加这些会议 在某种程度上,管理员应该能够“半冻结”应用程序。这基本上是设定一段时间(我们称之为“冻结期”),在此期间会发生一些事情: 由于冻结期开始前创建的会议将很快包含在计算中,因此在冻结期内无法编辑会议 主持人可以继续创建新会议和编辑这些会议,因为这些新会议不会影响计算 网站上会出现解释这些问题的警告 原则上,我可以创建一个冻结期模型,但实际上我不需要一次存储几个冻结期,因为一旦冻结期结束,它们就会被丢弃 因此,我正在寻找

我有一个Rails应用程序,其中主持人可以管理
会议
,普通
用户可以参加这些会议

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

  • 由于冻结期开始前创建的会议将很快包含在计算中,因此在冻结期内无法编辑会议
  • 主持人可以继续
    创建
    新会议和
    编辑
    这些会议,因为这些新会议不会影响计算
  • 网站上会出现解释这些问题的警告
原则上,我可以创建一个
冻结期
模型,但实际上我不需要一次存储几个冻结期,因为一旦冻结期结束,它们就会被丢弃

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


这有意义吗?例如,最佳实践是否包括将“单例模型”存储在数据库中的方法?

我认为,使用具有以下属性的
冻结期
模型将是一个很好的设计:

  • 开始日期
  • 结束日期
然后,您可以编写逻辑来检查当前是否存在活动冻结期


使用此方法,您可以保留冻结期的历史记录,也可以计划将来的冻结。

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

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

您还可以使用与上述操作相同的工具,它有助于通过设置扩展模型。

Rails.cache
是存储此类临时状态的好地方。请确保您使用的不是文件存储。谢谢,@SergioTulentsev!如果这个冻结期可能会持续两周,这是否成立?取决于缓存后端,它是否会发生意外的密钥过期等:)为了安全起见,我会将其存储在数据库中<代码>如果FrozenPeriod.count>0;显示警告
。然后,在完成之后,删除所有冻结的时段,这样表就又空了。这里的可能性是无限的。同意。我希望有一个“单例模型”的选项,rails知道如何找到唯一的一个<代码>如果FrozenPeriod.active;例如,显示警告。这不是过度工程化了吗?他显然不需要这些高级功能(历史记录和日程安排),这取决于你的品味。我几乎不会把一个有3-4列和12行的表称为过度工程。好吧,但与他要求的一个布尔标志相比,它是过度工程了。这也要看情况而定。如果一个利益相关者进来问“嘿,谁把这个小小的bool标志设置为true”?如果你不知道答案,你可能会遇到麻烦:)真的,真的:)
class FrozenPeriod 
   def self.active?
      FrozenPeriod.first.active
   end

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