データ型が unsigned int のテーブルに列を追加する移行を生成したいと考えています。この記事で説明したように、IP アドレスを保存するために使用したいと考えています。
この質問に出くわしましたが、移行データベースが依存するようになります。より良い方法で行う方法はありますか?
Rails 移行内でもう少しネイティブに実行できる実用的なソリューションを次に示します。Ruby on Rails 移行の unsigned int フィールド?
寿命を延ばすための答えは、型のない列のオプションにカスタム仕様を追加することです。
t.column :population, 'integer unsigned'
「署名されていない整数」を使用することは、合理的にデータベースに依存しないと思いますが、100% ではない可能性があります。特定のデータベースに自分自身をロックしたい場合は、「BIGINT unsigned」などを使用することもできます。
また、同じ量のストレージスペースを使用しているときに符号なし整数が異なるデータセットを保持しているという事実を完全に無視しているように見えるという点で、ジェフの答えには少しがっかりしています。負の数を必要としないことがわかっていて、データ ストレージの最適化に関心がある場合は、unsigned int が役立ちます。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"
ステップ 2: gem をインストールする
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 つではありません。
以下のガイドのセクション 1.4 を参照してください。
http://guides.rubyonrails.org/migrations.html
署名なしが必要だと思う理由がわかりません。整数と符号なしはどちらも同じ数のビットを取り、符号付きは、ビットの 1 つを符号付きビットとして解釈するという規則を示しているだけです。符号付きビットがオンになっている値を割り当てると、データベースはそれが負の数であると判断しますが、自分がまだマシンよりも賢いことに気づき、自分自身に微笑むことができます。
それが役立つことを願っています。