Rails枚举与Postgres集成

时间:2016-09-23 09:39:26

标签: ruby-on-rails ruby postgresql enums

我有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提取它时会弄乱它。

请告诉我,我做错了。

2 个答案:

答案 0 :(得分:2)

这是Rails 4的问题,这已在Rails 5 as per this patch中修复。

你可以这样做以获得Rails 4中的枚举值:

User.first[:designation]

答案 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.