在Ruby on Rails中,如何处理必须持久化到数据库但不是适当模型的数据?

5
假设有一个用Ruby on Rails编写的Web应用程序。该应用程序的一部分状态由一些数据表示,但这些数据并不符合模型的描述。需要将此状态描述符持久化到与模型相同的数据库中。 与模型不同的是,它的类只需要一个实例,并且没有与其他类的关系。 有人遇到过类似的情况吗?
5个回答

3

如果是数据,并且在数据库中,那么它就是模型的一部分。


3
根据您的描述,我认为rails-settings插件可以满足您的需求。
从Readme中可以看出:
“Settings是一个插件,使全局键值对表的管理变得容易。将其视为存储在数据库中的全局哈希,使用类似于ActiveRecord的简单方法进行操作。跟踪任何您不想硬编码到Rails应用程序中的全局设置。您可以存储任何类型的对象。字符串、数字、数组或任何对象。” http://github.com/Squeegy/rails-settings/tree/master

1

这不是一个真正的RoR问题,而是一个通用的OO设计问题。

如果是我,我可能会找到一种将数据概念化为模型的方法,然后只需使用工厂方法和私有构造函数将其作为单例。

或者,您可以将其视为一种日志记录形式。在这种情况下,您只需要一个Logger类(也是单例),直接读/写数据库,并在每个请求的开始和结束时调用它。


1
在Rails中,如果数据存储在数据库中,那么它就会被存放在一个模型中。在这种情况下,该模型可以被称为“Configuration”,但它仍然被映射到Rails系统中的一个ActiveRecord类。
如果这些数据是真正静态的,您可能根本不需要使用数据库。您可以在应用控制器中使用(例如)一个变量:
class ApplicationController < ActionController::Base
  helper :all 
  @data = "YOUR DATA HERE"   
end

有许多方法可用于实例化数据以在Rails应用程序中使用。


0
我不确定我理解你为什么说它无法适应Rails模型。
如果只是一个复杂的数据结构,只需在数据库中保存一堆Ruby代码即可:-)
例如,如果您有一个复杂的嵌套哈希要保存,请将以下内容分配给您的“数据”文本字段:
ComplexThing.data = complex_hash.inspect

当您想要读回它时,只需

complex_hash = eval ComplexThing.data

让我指出这个解决方案的另外两点:

  • 如果你的数据结构不是标准的 Ruby 类,简单的检查可能行不通。如果你在任何地方看到 #<MyClass:0x4066e3c>,那么某些东西没有被正确序列化。
  • 这是一个天真的实现。如果你冒着有 Unicode 数据或者确实保存了很多自定义类的风险,你可能想要查看真正的序列化解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接