这里展示了一种可行的解决方案,可以在Rails迁移中更加原生地实现: 在Ruby on Rails迁移中创建无符号整数字段?
为了长期考虑,答案是在选项中添加自定义规范以创建无类型列:
t.column :population, 'integer unsigned'
我认为使用“integer unsigned”在数据库中是相对独立的,但可能不是100%。如果您愿意将自己锁定到特定的数据库,也可以使用类似“BIGINT unsigned”的东西。
此外,我对Geoff的回答有些失望,因为他似乎完全忽视了一个无符号整数尽管使用相同的存储空间,但保存了不同的数据集这一事实。如果您知道不需要负数并且有兴趣优化数据存储需求,则无符号整数很有价值。有关mysql指南,请参见:http://dev.mysql.com/doc/refman/5.5/en/integer-types.html
需要指出JellicleCat下面的说明非常重要,即模式文件将无法跟踪此更改,因此在加载模式时将丢失列的签名方面。
population
字段设置有符号位。 - JellicleCat第一步:
将activerecord-mysql-unsigned添加到GemFile中。
# add unsigned integer support to mysql2 adapter
gem "activerecord-mysql-unsigned", "~> 0.0.1"
步骤2:安装Gems
bundle install
步骤三:
在您喜欢的字段中使用“unsigned: true”。
t.integer :cost, unsigned: true
你可以通过执行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 int
,因此@shobhit想要的类型无法实现。因此,我建议执行SQL查询。 - Raghvendra Parashar抱歉。Unsigned 不是支持的 Rails 数据类型之一。
请参阅下面指南的第 1.4 节。
http://guides.rubyonrails.org/migrations.html
我不确定你为什么认为你需要无符号。整数和无符号都占用相同数量的位,有符号只是表示您想将其中一个位解释为有符号位的约定。如果您分配一个带有有符号位的值,数据库将认为它是负数,但您会更明白,您可以意识到自己比机器更聪明,因此可以微笑。
希望这可以帮助到您。
validates :cost, numericality: { greater_than: 0 }
- Dorian