Frage

Wie kann ich die (Standard) zu ändern geben Sie für Active die IDs? int nicht lang genug ist, würde ich es vorziehen, lange. Ich war überrascht, dass es keine: lange für die Migrationen - macht man nur einige dezimal verwenden

War es hilfreich?

Lösung

http://moeffju.net/blog/using- bigint-Spalten-in-Schienen-Migrationen

class CreateDemo < ActiveRecord::Migration
  def self.up
    create_table :demo, :id => false do |t|
      t.integer :id, :limit => 8
    end
  end
end
  • Sehen Sie die Option :id => false, die die automatische Erstellung des ID-Feld deaktiviert
  • Die t.integer :id, :limit => 8 Linie wird ein 64-Bit-Integer-Feld
  • produzieren

Andere Tipps

Standard-Primärschlüsselspalte Typen einstellen , die Migrationsdateien sind nicht der richtige Ort, um Chaos mit.

Stattdessen nur kleben diese an der Unterseite des config/environment.rb

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

Und alle sollten zusammen mit dem beabsichtigten Spaltentyp für id erstellt werden:

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

Nachdem Sie das getan, was du hast ... die nächste Frage zu tun dargelegt ist wahrscheinlich „Wie kann ich meine Fremdschlüsselspalten die gleiche Spalte Typ zu machen?“ da es keinen Sinn macht Primärschlüssel people.id als bigint(20) unsigned zu haben, und person_id int(11) oder irgendetwas anderes sein?

Für die Spalten, Sie auf die anderen Vorschläge beziehen, z.

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

UPDATE : @Notinlist, um beliebige Spalte für Primärschlüssel auf beliebige Tabellen zu verwenden, müssen Sie den create_table-change_column Tanz tun:

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

z. Wenn ich wollte, anstatt Autoinkrement ganze Zahlen guid,

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

Das ist schwer für den Primärschlüssel mit Migrationen zu setzen, weil Rails automatisch in setzt.

Sie können später jede Spalte ändern wie folgt:

change_column :foobars, :something_id, 'bigint'

Sie können angeben, nicht primäre IDs als benutzerdefinierte Typen in Ihrer ursprünglichen Migration wie folgt aus:

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

Wo habe ich „bigint“ Sie einen beliebigen Text setzen können, die Ihre Datenbank für die Datenbank-Spaltentyp verwenden würden, die Sie verwenden möchten (zum Beispiel „unsigned long“).

Wenn Sie Ihre ID-Spalte benötigen eine Bigint zu sein, ist der einfachste Weg, es zu tun wäre, um die Tabelle zu erstellen, dann die Spalte in der mit change_column gleichen Migration zu ändern.

Mit PostgreSQL und SQLite sind Schemaänderungen Atom so wird dies nicht lassen Sie Ihre Datenbank in einem seltsamen Zustand, wenn die Migration fehlschlägt. Mit MySQL müssen Sie vorsichtiger sein.

Nach der Rails-API-Dokumentation sind die möglichen Optionen für Typen:

:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean

Sie können mit: dezimal, oder Sie können einen Befehl direkt ausführen, wenn Sie benötigen:

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

Wie wappos darauf hingewiesen, können Sie Hilfsoptionen verwenden wie: Limit Active zu sagen, wie groß Sie die Spalte sein sollen. So würden Sie verwenden, um die: int Spalt mit einer größeren. Grenze

Wenn jemand dies muss mit PostgreSQL umgehen, erstellen Sie einen Initialisierer wie folgt aus:

# config/initializers/bigint_primary_keys.rb
ActiveRecord::Base.establish_connection
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key'

Durch verzögertes Laden in Rails 3.2 (und vielleicht sogar früheren Versionen), ActiveRecord::ConnectionAdapters::PostgreSQLAdapter nicht erforderlich sein wird, bis Sie die Datenbankverbindung herzustellen.

In rails4, können Sie es tun.

Es folgt ein Beispiel eines Dummy Modell in rails4 & postgres zu erstellen,

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

Was es getan hat:

  • verwenden Es serial8 als id-Typ, die 64-Bit-Ganzzahl ist, und definiert sie als primary key.
  • Es timestamptz als Datetime-Typ verwendet werden, die die Zeitzone Informationen enthalten, dies ist wichtig für eine Anwendung, die über mehrere Zeitzonen gehen.

Rails 3, MySQL:

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

Hat mir keine Bigint, nur ein int. Allerdings

t.column :twitter_id, 'bigint'

funktioniert. (Obwohl es tut mir MySQL binden.)

Leihen von anderen Lösungen, angepasst für das, was in letzter Zeit für mich gearbeitet.

Fügen Sie in einer Datei in config/initializers. Sie erklärt, eine neue Spalte Typ (von chookeat Vorschlag angepasst).

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

Migrationen, die eine lange ID verwenden, sind als solche:

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

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

Ich schrieb ein Juwel namens active-native_db_types_override , dass Sie die Datentypen ändern können, die verwendet wird, in Ihrem Migrationen.

In Ihrem Gemfile hinzufügen:

gem 'activerecord-native_db_types_override'

dann in config / environment.rb, lange ids in Postgres zu verwenden, fügen Sie:

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

Sehen Sie seine README für up-to-date Informationen.

Sie können es tun, wie folgt:

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

Korrektur, wie der Standard primary key Spaltentyp zu ändern:

Statt:

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

Sie tun sollten:

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

oder sonst werden Sie nicht in der Lage sein foreign key Einschränkungen in der Datenbank-Ebene hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top