10

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

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

4

4 回答 4

16

此处显示了一个可行的解决方案,可让您在 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 的注释,即模式文件不会跟踪此更改,因此当模式加载时,列的签名方面将丢失。

于 2013-10-14T21:09:23.240 回答
9

第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

于 2013-11-23T09:01:45.400 回答
1

您可以通过执行 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
于 2013-01-16T15:47:24.343 回答
-7

对不起。Unsigned 不是受支持的 Rails 数据类型之一。

请参阅以下指南的第 1.4 节。

http://guides.rubyonrails.org/migrations.html

我不确定你为什么认为你需要未签名。整数和无符号都采用相同数量的位,有符号只是表示您希望将其中一个位解释为有符号位的约定。如果您在有符号位打开的位置分配一个值,数据库会认为它是一个负数,但您会知道得更好,并且您可以对自己微笑,意识到您仍然比机器更聪明。

我希望这会有所帮助。

于 2013-01-16T14:42:56.857 回答