如何在ruby中创建一个默认为字符串而不是Integer的迁移,我想将枚举存储到数据库中,但我不想将其存储为Integer,因为这样就没有意义了另一个想要使用同一个表的应用程序。我如何UIImage
代替default: "female"
default:0
我
答案 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 <创建了一个User
类string
类/ 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)
enum
和MySQL中的ENUM
type是两个不同的东西。
enum
只是integer
列的包装器,因此您更容易在查询中使用字符串,而不是整数。但是在数据库级别,它全部转换为整数(由Rails自动转换),因为这是列的类型。
ENUM
类型是特定于供应商的列类型(例如,SQLite doesn't support it,但是PostgreSQL does)。在MySQL中:
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)。