这是我的模型定义:
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
枚举的正确方法是什么?
谢谢
答案 0 :(得分:1)
请参见the official documentation for ActiveRecord::Enum
-想法不是要有两个属性名称(unit
和frequency_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']