10

データ型が unsigned int のテーブルに列を追加する移行を生成したいと考えています。この記事で説明したように、IP アドレスを保存するために使用したいと考えています。

この質問に出くわしましたが、移行データベースが依存するようになります。より良い方法で行う方法はありますか?

4

4 に答える 4

16

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 のメモを呼び出すことが重要です。スキーマ ファイルはこの変更を追跡しないため、スキーマが読み込まれると列の署名された側面が失われます。

于 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"

ステップ 2: gem をインストールする

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 つではありません。

以下のガイドのセクション 1.4 を参照してください。

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

署名なしが必要だと思う理由がわかりません。整数と符号なしはどちらも同じ数のビットを取り、符号付きは、ビットの 1 つを符号付きビットとして解釈するという規則を示しているだけです。符号付きビットがオンになっている値を割り当てると、データベースはそれが負の数であると判断しますが、自分がまだマシンよりも賢いことに気づき、自分自身に微笑むことができます。

それが役立つことを願っています。

于 2013-01-16T14:42:56.857 に答える