我有User
模型,其中designation
属性。
我在Enum
中创建了Postgres
,并将designation
设为enum
。
这是迁移文件。
class AddDesignationToUsers < ActiveRecord::Migration
def change
execute <<-SQL
CREATE TYPE user_designations AS ENUM ('Newbie', 'Coder', 'Owner', 'Lead', 'Architect');
SQL
add_column :users, :designation, :user_designations
end
end
我还在模型文件User.rb
enum designation: { newbie: 'Newbie' , coder: 'Coder', owner: 'Owner',
lead: 'Lead', architect: 'Architect' }
现在当我试图指定用户时,请说User.first.designation
。我的价值coder
而不是Coder
。
但是当我在控制台中输入User.first
时,我可以看到指定的值为Coder
,这是预期的。但是,我不知道为什么在使用User.first.designation
提取它时会弄乱它。
请告诉我,我做错了。
答案 0 :(得分:2)
答案 1 :(得分:0)
在rails中声明枚举键时,应始终使用小写。这些键用于命名范围方法,例如,如果您将它们声明为:
class Order < ActiveRecord:Base
enum status: { Processing: 0 Shipped: 1 }
end
这将为您提供范围Order.Processing
。 Ruby会让你这样做,因为范围(类方法)是用define_method
定义的,所以Processing
不被视为常量,但它作为一种编码风格非常糟糕。
同样Order.first.status
将给我们左手键值 - 而不是实际的db值(0)。
如果您想访问映射,请执行Order.statuses[Order.first.status]
。
然而,可能只是简单地考虑错误 - ActiveRecord::Enum
意味着存储用于查询模型并由系统使用的状态等枚举的方法。
它不是设计为存储枚举的人性友好文本版本的机制!我建议您使用snake_case
的枚举值,以避免混淆,即使使用PG本机枚举类型。
You can use the I18n module to provide human friendly labels for enumerated attributes.