使用枚举类型作为属性值的Rails

时间:2019-10-10 06:43:45

标签: ruby enums model migration ruby-on-rails-5

这是我的模型定义:

class OrderFrequency < ApplicationRecord
  self.table_name = "order_frequencies"
  enum frequency_unit: { hour: 1}

end

和迁移

class CreateOrderFrequencies < ActiveRecord::Migration[5.2]
  def change
    create_table :order_frequencies do |t|
      t.string :value
      t.integer :unit
      t.timestamps
    end
  end
end

那么如何为unit的枚举分配frequency_unit属性呢?

我不能做

OrderFrequency.create(value: 'value 123', unit: OrderFrequency.frequency_unit.hour)

为单位属性使用frequency_unit枚举的正确方法是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

请参见the official documentation for ActiveRecord::Enum -想法不是要有两个属性名称(unitfrequency_unit);您应该只有一个 。 (毕竟,是同一回事!)

让我们将模型更改为:

class OrderFrequency < ApplicationRecord
  # Note: Specifying the (default) table_name here is also redundant
  enum unit: { hour: 1 }
end

现在您可以通过以下方式创建记录:

OrderFrequency.create(
  value: 'value 123',
  unit: OrderFrequency.units['hour']
)

甚至可以这样写:(p):

OrderFrequency.create(
  value: 'value 123',
  unit: 'hour'
)

ActiveRecord::Enum的主要思想是在数据库中的值存储为整数,但在应用程序中存储 (99%的时间)您可以使用对人类友好的String-即"hour"而不是1

如果由于某种原因需要检索所有已知unit的列表,可以使用以下方法进行操作:

OrderFrequency.units.keys #=> ['hour']