我想生成迁移以将列添加到数据类型为 unsigned int 的表中。我希望使用它来存储本文中提到的 IP 地址。
我遇到了这个问题,但它会使迁移数据库依赖,知道如何以更好的方式做到这一点吗?
此处显示了一个可行的解决方案,可让您在 Rails 迁移中更本机地执行此操作:Ruby on Rails 迁移中的 unsigned int 字段?
为了长寿,答案是在您的选项中为无类型列添加自定义规范:
t.column :population, 'integer unsigned'
我相信使用“无符号整数”是合理的独立于数据库的,但可能不是 100%。如果您愿意将自己锁定在特定的数据库中,您也可以使用类似“BIGINT unsigned”的东西。
此外,我对 Geoff 的回答有点失望,因为它似乎完全忽略了这样一个事实,即使用相同数量的存储空间的无符号整数拥有不同的数据集。如果您知道您将不需要负数并且有兴趣优化您的数据存储需求,那么无符号整数是有价值的。要查看 mysql 的指南,请参阅: http ://dev.mysql.com/doc/refman/5.5/en/integer-types.html
重要的是要在下面调用 JellicleCat 的注释,即模式文件不会跟踪此更改,因此当模式加载时,列的签名方面将丢失。
第1步:
将 activerecord-mysql-unsigned 添加到 GemFile
# add unsigned integer support to mysql2 adapter
gem "activerecord-mysql-unsigned", "~> 0.0.1"
第二步: 安装宝石
bundle install
第 3 步:
在您喜欢的字段中使用“unsigned: true”
t.integer :cost, unsigned: true
参考:http ://rubydoc.info/gems/activerecord-mysql-unsigned/0.0.1/frames
您可以通过执行 SQL 查询来做到这一点,
如果是 MySQL 查询将是
添加新列
ALTER TABLE table_name ADD column_name INT unsigned;
删除列
ALTER TABLE table_name DROP column_name;
和迁移:
class MyMigration < ActiveRecord::Migration
def self.up
execute "ALTER TABLE table_name ADD column_name INT unsigned;"
end
def self.down
execute "ALTER TABLE table_name DROP column_name;"
end
end
对不起。Unsigned 不是受支持的 Rails 数据类型之一。
请参阅以下指南的第 1.4 节。
http://guides.rubyonrails.org/migrations.html
我不确定你为什么认为你需要未签名。整数和无符号都采用相同数量的位,有符号只是表示您希望将其中一个位解释为有符号位的约定。如果您在有符号位打开的位置分配一个值,数据库会认为它是一个负数,但您会知道得更好,并且您可以对自己微笑,意识到您仍然比机器更聪明。
我希望这会有所帮助。