質問

変更するには、どうすればいいで(デフォルトの)タイプActiveRecordのId?intではないが、好みの長さです。ることには驚きはありません:長のための移動でなただけの一点?

役に立ちましたか?

解決

単位 http://moeffju.net/blog/using-bigint-columns-in-rails-migrations

class CreateDemo < ActiveRecord::Migration
  def self.up
    create_table :demo, :id => false do |t|
      t.integer :id, :limit => 8
    end
  end
end
  • のオプション :id => false を無効に自動作成のidフィールド
  • t.integer :id, :limit => 8 ラインを演出しまたは64ビット整数の分野

他のヒント

設定 デフォルトのキーカラムタイプ, の移動-ファイルの場所に嬉します。

代わりに、これを付け下の config/environment.rb

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

全てのテーブルが作れるはずのカラムタイプ id:

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment | 

まきん出くださ---次の問題は"どうやって自分の外部キーカラムと同じカラムタイプ?"からとってあまり意味がありませんへ主キー people.id として bigint(20) unsigned, は、 person_id すると int(11) たでしょうか?

の方に列されていることをご確認くださいその他のご提案など

t.column :author_id, 'BIGINT UNSIGNED'
t.integer :author_id, :limit => 8

更新:@Notinlist、任意のカラムのための主なキーを任意のテーブルを行う必要があります。 create_table-change_column ダンス:

create_table(:users) do |t|
  # column definitions here..
end
change_column :users, :id, :float # or some other column type

例えばてしまうことがありました guid の代わりに自動的に整数を表す

create_table(:users, :primary_key => 'guid') do |t|
  # column definitions here..
end
change_column :users, :guid, :string, :limit => 36

これは、Railsは自動的にそれを置くための移行と、主キーに設定することは困難です。

あなたはこのように後から任意の列を変更することができます:

change_column :foobars, :something_id, 'bigint'

あなたは、このようなあなたの最初の移行にカスタムタイプとして非プライマリIDを指定することができます:

create_table :tweets do |t|
  t.column :twitter_id, 'bigint'
  t.column :twitter_in_reply_to_status_id, 'bigint'
end

私はあなたのデータベースは、あなたが(例えば、「unsigned long型」)を使用するデータベースのカラム型のために使用する任意のテキストを置くことができる「BIGINT」を持っているところます。

あなたがBIGINTであるためにあなたのidカラムが必要な場合は、

、それを行うための最も簡単な方法はchange_columnと同じ移行に列を変更、その後、テーブルを作成することです。

PostgreSQLとSQLiteのでは、スキーマの変更はアトミックですので、移行が失敗した場合、これは奇妙な状態でデータベースを残すことはありません。 MySQLのを使用すると、より注意する必要があります。

RailsのAPIドキュメントによると、タイプのための可能なオプションがあります:

:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean
小数の、またはあなたがする必要がある場合は、直接コマンドを実行することができます:

あなたは使用することができます。

class MyMigration
  def self.up
    execute "ALTER TABLE my_table ADD id LONG"
  end
end

wapposが指摘したように、あなたのような補助のオプションを使用することができます:あなたは、列になりたいどのように大規模なActiveRecordのを伝えるために制限。大きなとint型の列:だからあなたが使用することになります。リミット

誰がPostgreSQLので動作するようにこれを必要とする場合、このような初期化子を作成します:

# config/initializers/bigint_primary_keys.rb
ActiveRecord::Base.establish_connection
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key'
あなたは、データベース接続を確立するまで、

そのためのRails 3.2での遅延ロード(多分それ以前のバージョン)の、ActiveRecord::ConnectionAdapters::PostgreSQLAdapterが必要とされることはありません。

rails4, できます。

以下の例の作成 Dummy モデル rails4 & postgres,

xxx_migrate_dummies.rb

class CreateDummies < ActiveRecord::Migration
  def change
    create_table :dummies, :id => false do |t|
      t.column :id, :serial8, primary_key: true
      t.string :name, :limit => 50, null: false
      t.integer :size, null: false

      t.column :create_date, :timestamptz, null: false
    end
  end
end

う:

  • Itの使用 serial8 idとしている64ビット整数で指定することができまし primary key.
  • Itの使用 timestamptz としてのdatetimeのタイプのタイムゾーン情報において、このことを理由に、不必要なアプリを複数タイムゾーン.

のRails 3は、MySQLます:

t.column :foobar, :int, :limit => 8

私のbigint、int型のみを与えるものではありません。しかし、

t.column :twitter_id, 'bigint'

が正常に動作します。 (これは、MySQLに私を結ぶんが。)

最近、私のために働いていた何のために調整し、他のソリューションから

借入、ます。

config/initializers内のファイルに追加します。これは、(chookeatの提案から適応)新しい列タイプを宣言します。

ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:long_primary_key] = "BIGINT(20) DEFAULT NULL auto_increment PRIMARY KEY"

の長いIDを使用する移行は、通りである:

    create_table :notification_logs, :id => false do |t|

      t.column :id, :long_primary_key
      # ...
    end

私はあなたが使用されるデータ型を変更することができますのActiveRecord-native_db_types_overrideすると呼ばれる宝石を書きましたあなたの移行インチ

あなたのGemfileに、追加します。

gem 'activerecord-native_db_types_override'

、その後のconfig / environment.rbにして、追加、postgresのに長いIDを使用します。

NativeDbTypesOverride.configure({
  postgres: {
    primary_key: { name: "bigserial primary key"}
  }
})

最新情報についてその README を参照してください。

あなたはこのようにそれを行うことができます:

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users, id: :bigserial do |t|
      t.string :name
    end
  end
end

デフォルトのprimary keyの列の種類を変更する方法に修正ます:

の代わりに:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

あなたが行う必要があります:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT(8) UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

や他のデータベース層にforeign keyの制限を追加することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top