Rails 3迁移用于添加unsigned int列

Sho*_*hit 10 ruby-on-rails rails-migrations ruby-on-rails-3

我想生成一个迁移,将列添加到数据类型为unsigned int的表中.我希望用它来存储本文中提到的IP地址.

我遇到了这个问题,但它会使迁移数据库依赖,任何想法如何以更好的方式做到这一点?

who*_*ton 15

这里显示了一个工作解决方案,它允许您在rails on Rails内部更加原生地执行它:Ruby on Rails迁移中的unsigned int字段?

为了长寿,答案是在无类型列的选项中添加自定义规范:

t.column :population, 'integer unsigned'
Run Code Online (Sandbox Code Playgroud)

我相信使用'integer unsigned'可以合理地与数据库无关,但可能不是100%.如果您愿意将自己锁定到特定数据库,也可以使用"BIGINT unsigned"之类的东西.

此外,我对Geoff的回答感到有些失望,因为它似乎完全忽略了这样一个事实,即使用相同数量的存储空间时,无符号整数会保存不同的数据集.如果您知道自己不需要负数且有兴趣优化数据存储需求,那么无符号整数就很有价值.要查看mysql的指南,请参阅:http: //dev.mysql.com/doc/refman/5.5/en/integer-types.html

请注意以下JellicleCat的注释,即架构文件不会跟踪此更改,因此在加载架构时,列的签名方面将丢失.

  • 这个答案的问题是 Rails 的 schema.rb 文件永远不会反映特殊的“unsigned”属性。因此,当您在新环境中设置应用程序并使用架构文件创建数据库时,您的应用程序将具有“population”的签名字段。 (2认同)

Moh*_*deh 9

步骤1:

将activerecord-mysql-unsigned添加到GemFile

# add unsigned integer support to mysql2 adapter
gem "activerecord-mysql-unsigned", "~> 0.0.1"
Run Code Online (Sandbox Code Playgroud)

第2步: 安装宝石

bundle install
Run Code Online (Sandbox Code Playgroud)

第3步:

在你喜欢的字段中使用"unsigned:true"

t.integer :cost, unsigned: true
Run Code Online (Sandbox Code Playgroud)

参考:http: //rubydoc.info/gems/activerecord-mysql-unsigned/0.0.1/frames