我有一个小的 Rails 4.2 应用,它有一些我希望在网站范围内更改的设置,例如
start_time: time, finish_time: time, disabled: boolean
我知道我可以创建一个名为AppSettings
的模型并在其中包含这些字段,但我只想要一个实例可用,因为它们应该是网站范围的
这种模式的可接受方法是什么?
我还应该提到这些设置需要从前端更新。
答案 0 :(得分:1)
看起来Rails的新自定义配置是你想要的,具体取决于你的用例。
https://github.com/rails/rails/commit/611849772dd66c2e4d005dcfe153f7ce79a8a7db
Rails.configuration.x.start_time = Time.now
等等。您可以从应用程序的任何位置访问此配置,并且在任何时间点只会有一个实例。
如果这不符合您的使用案例,可能还有其他选择。
修改强>
为了真正回答OP的更新问题,我可以想出两种方法来实现持久的配置。
每个配置值一行
创建一个模型/表格,其中包含设置name
的列和设置value
然后您的模型可以确保并确认每个设置只有一行,并确保正确读取/写入设置。
class AppSettings < ActiveRecord::Base
validate_uniqueness_of :name
def self.[](setting_name)
find_by_name(setting_name) or raise ActiveRecord::RecordNotFound, "cannot find setting for #{setting_name}"
end
end
这样做的两个缺点是,您需要确保每个设置都转换为正确的类型,并且每次需要设置时都会访问数据库。
单行表
这将允许您为每个设置添加一个列,但缺点是您需要确保表中只有一行,除非您需要在应用程序逻辑中设置多个设置。
为了确保只使用一行,您必须创建一个仅对该行执行查询的接口。像这样的东西
class AppSettings < ActiveRecord::Base
def self.current
first_or_create(setting_one: "default", setting_two: "another")
end
end
然后,您只需要确保在AppSettings
模型中使用current
类方法时。