如何将enum作为字符串存储到rails中的数据库中

时间:2015-10-04 21:42:18

标签: ruby-on-rails ruby enums

如何在ruby中创建一个默认为字符串而不是Integer的迁移,我想将枚举存储到数据库中,但我不想将其存储为Integer,因为这样就没有意义了另一个想要使用同一个表的应用程序。我如何UIImage代替default: "female"

default:0

5 个答案:

答案 0 :(得分:19)

阅读enum文档,您可以看到 Rails 使用Array的值索引解释为:

  

请注意,使用Array时,从值到数据库整数的隐式映射是从值在数组中出现的顺序派生的。

但也有人说你可以使用Hash

  

也可以使用Hash显式映射属性和数据库整数之间的关系。

以示例:

class Conversation < ActiveRecord::Base  
  enum status: { active: 0, archived: 1 }  
end

所以我使用 Rails 4.2.4 sqlite3 进行了测试,并为 sex <创建了一个Userstring类/ em>类型和Hash中的enum string值{我使用 fem mal 值与女性男性):

迁移:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :sex, default: 'fem'
    end
  end
end  

型号:

class User < ActiveRecord::Base
  enum sex: { female: 'fem', male: 'mal' }
end

在控制台中:

u = User.new
#=>  #<User id: nil, sex: "fem">
u.male?
#=> false
u.female?
#=> true
u.sex
#=> "female"
u[:sex]
#=> "fem"
u.male!
# INSERT transaction...
u.sex
#=> "male"
u[:sex]
#=> "mal"

答案 1 :(得分:11)

Rails中的

enum和MySQL中的ENUM type是两个不同的东西。

    Rails中的
  1. enum只是integer列的包装器,因此您更容易在查询中使用字符串,而不是整数。但是在数据库级别,它全部转换为整数(由Rails自动转换),因为这是列的类型。

  2. MySQL中的
  3. ENUM类型是特定于供应商的列类型(例如,SQLite doesn't support it,但是PostgreSQL does)。在MySQL中:

  4.   

    ENUM是一个字符串对象,其值从允许值列表中选择,这些值在表创建时在列规范中显式枚举。

    CREATE TABLE shirts (
        name VARCHAR(40),
        size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
    );
    INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),
      ('polo shirt','small');
    SELECT name, size FROM shirts WHERE size = 'medium';
    +---------+--------+
    | name    | size   |
    +---------+--------+
    | t-shirt | medium |
    +---------+--------+
    

    对于迁移,您需要执行以下操作:

    class AddSexToUsers < ActiveRecord::Migration
      def change
        add_column :users, :sex, "ENUM('female', 'male') DEFAULT 'female'"
      end
    end
    

答案 2 :(得分:5)

我执行以下操作来存储字符串状态并使用有利的Rails辅助方法:

def self.up
  add_column :works, :status, :string, null: false, default: 'offering'
end

class Work < ApplicationRecord
  ALL_STATES = %w[canceled offering running payment rating done].freeze
  enum status: ALL_STATES.zip(ALL_STATES).to_h
end

答案 3 :(得分:1)

看看这个要点,Rails不会立即提供它,因此您必须使用关注点:

https://gist.github.com/mani47/86096220ccd06fe46f0c09306e9d382d

答案 4 :(得分:0)

据我所知,使用标准的Rails枚举是不可能的。查看https://github.com/lwe/simple_enum,它功能更丰富,并且还允许将枚举值存储为DB的字符串(列类型字符串,即DB中的varchar)。