使用Ruby语言,我必须在关系数据库中存储一些ruby :symbols
数据类型(让我们说只是一个简单的Sqlite(https://www.sqlite.org/),也许是通过Sequel' s ORM(参见:https://github.com/jeremyevans/sequel)。所以不要讨论数据库特定功能(postgres enum等)。
在我的应用程序中,符号表示有限状态机的状态(因此我必须使用某种枚举进行管理)。
让我们考虑以下代码(另请参阅:https://github.com/soveran/micromachine):
require 'micromachine'
machine = MicroMachine.new(:new) # Initial state.
# Define the possible transitions for each event.
machine.when(:confirm, :new => :confirmed)
machine.when(:ignore, :new => :ignored)
machine.when(:reset, :confirmed => :new, :ignored => :new)
machine.trigger(:ignore) #=> true
machine.state #=> :ignored
如您所见,我使用符号表示不同的状态:
:new, :ignored, :confirmed
在某种意义上是一种enum
状态(每个有限状态机包括一个"固定的"状态集)。
现在我必须在关系数据库的一列中保存(持久化)machine.state
。
在db?
中存储状态(ruby数据结构中的符号)的建议方法是什么?以下是一些可能的想法:
A"关系"利用查找表将符号映射到数字,以及执行连接操作的方法。
另一种方法是在ruby程序中编写枚举(嵌入查找);请参阅:How to store and compare :symbols in an ActiveRecord (Ruby on Rails)和:Enums in Ruby
一个简单的解决方案是将字符串转换为符号,然后将其保存到db:
```
machine.state #=> :ignored
machine.state.to_s #=> "ignored"
dataset.insert(:status => machine.state.to_s)
```
但我感到困惑,因为理想情况下我想避免使用明确的符号< - >整数映射(在db中持久化时)。
有任何建议/最佳做法吗?
更新: 为了完整性:"州"可以假设很多(数十和数十)不同的值(符号),而不仅仅是这里提出的例子中的少数值。
答案 0 :(得分:0)
我建议您将符号存储为字符串,然后将其转换回读取时的符号。像这样的东西(一个ActiveRecord例子):
class MiniMachine < ActiveRecord::Base
def state
super.to_sym if state?
end
end
通过ActiveRecord将符号保存到字段中会自动将其转换为字符串,您不必再做任何其他操作。
答案 1 :(得分:0)
如果您对代码没有任何特定限制(即性能,内存/磁盘空间限制),请选择最简单的解决方案。根据您问题中的信息,我选择第3页 - 只是将其转换为字符串。