Wie lange id in Rails-Anwendungen zu benutzen?
-
21-08-2019 - |
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
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 alsprimary 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.