如何在Ruby中创建迁移,在Ruby中默认为字符串而不是Integer,我想将枚举存储到数据库中,但不想将其存储为Integer,因为这样对于想要使用相同表的另一个应用程序就没有意义了。如何用default: "female"
代替default:0
class AddSexToUsers < ActiveRecord::Migration
def change
add_column :users, :sex, :integer, default: 0
end
end
class User < ActiveRecord::Base
enum sex: [:female, :male]
has_secure_password
end
我
6条答案
按热度按时间vs91vp4v1#
阅读
enum
文档,您可以看到rails使用Array
的值索引,说明如下:请注意,当使用数组时,从值到数据库整数的隐式Map是根据值在数组中出现的顺序派生的。
但也声明您可以使用
Hash
:还可以使用Hash显式Map属性和数据库整数之间的关系。
下面是这个例子:
因此,我使用rails 4.2.4和sqlite3进行了测试,并创建了一个
User
类,其中string
类型对应于sex类型,enum
中的Hash
类型对应于string
值(我使用fem和mal值来区别于女性和男性):迁移:
模型:
在控制台中:
2g32fytz2#
我通常会做以下事情:
通过使用散列作为
enum
(see docs)的参数,可以将字符串存储在数据库中。同时,这仍然允许您使用所有很酷的Rails辅助方法:一行更新:
我完全忽略了我们从rails 1.2.6开始就有了
index_by
。这使得该解决方案甚至是一行程序:或者,我们从rails 6.0.0开始使用
index_with
:c7rzv4ha3#
Rails中的
enum
和MySQL中的ENUM
type是两个不同的东西。1.Rails中的
enum
只是integer
列的 Package 器,因此在查询中使用字符串比使用整数更容易。但在数据库级别上,它都被转换为整数(由Rails自动转换),因为这是列的类型。1.MySQL中的
ENUM
类型是厂商特定的列类型(例如,SQLite doesn't support it,但PostgreSQL does)。在MySQL中:ENUM是一个字符串对象,其值是从一个允许值列表中选择的,这些允许值在创建表时在列规范中显式列举。
对于迁移,您需要执行以下操作:
fjaof16o4#
请看一下这一要点,Rails不提供开箱即用的功能,因此您必须使用一个关注点:
https://gist.github.com/mani47/86096220ccd06fe46f0c09306e9d382d
6fe3ivhb5#
以下是将枚举作为字符串添加到模型
Company
的步骤ar7v8xwq6#
据我所知,使用标准的Rails枚举是不可能的。看看https://github.com/lwe/simple_enum,它的功能更丰富,还允许将枚举值作为字符串存储到DB(列类型字符串,即DB中的varchar)。