如何在关系数据库中存储Ruby:符号和枚举

时间:2015-10-27 10:07:45

标签: ruby enums relational-database symbols sequel

使用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数据结构中的符号)的建议方法是什么?

以下是一些可能的想法:

  1. A"关系"利用查找表将符号映射到数字,以及执行连接操作的方法。

  2. 另一种方法是在ruby程序中编写枚举(嵌入查找);请参阅:How to store and compare :symbols in an ActiveRecord (Ruby on Rails)和:Enums in Ruby

  3. 一个简单的解决方案是将字符串转换为符号,然后将其保存到db:

  4. ```

    machine.state              #=> :ignored
    machine.state.to_s         #=> "ignored"    
    dataset.insert(:status => machine.state.to_s)
    

    ```

    但我感到困惑,因为理想情况下我想避免使用明确的符号< - >整数映射(在db中持久化时)。

    有任何建议/最佳做法吗?

    更新: 为了完整性:"州"可以假设很多(数十和数十)不同的值(符号),而不仅仅是这里提出的例子中的少数值。

2 个答案:

答案 0 :(得分:0)

我建议您将符号存储为字符串,然后将其转换回读取时的符号。像这样的东西(一个ActiveRecord例子):

class MiniMachine < ActiveRecord::Base

  def state
    super.to_sym if state?
  end

end

通过ActiveRecord将符号保存到字段中会自动将其转换为字符串,您不必再做任何其他操作。

答案 1 :(得分:0)

如果您对代码没有任何特定限制(即性能,内存/磁盘空间限制),请选择最简单的解决方案。根据您问题中的信息,我选择第3页 - 只是将其转换为字符串。