Wie lange ID in Rails-Anwendungen verwenden?
Wie kann ich das ändern der (Standard) geben Sie für die ActiveRecord - IDs? int ist nicht lang genug, würde ich lieber lange. Ich war überrascht, dass es keine :lange für die Migration - macht man einfach einige decimal?
InformationsquelleAutor der Frage Björn | 2009-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Credits zu http://moeffju.net/blog/using-bigint-columns-in-rails-migrations
:id => false
deaktiviert die automatische Erstellung der id-Feldt.integer :id, :limit => 8
Linie produziert einen 64-bit-integer-FeldInformationsquelleAutor der Antwort Notinlist
Um die default primary key-Spalte Typdie migration-Dateien sind nicht der Ort, um Durcheinander mit.
Statt, nur kleben Sie diese an der Unterseite Ihres
config/environment.rb
Und alle Ihre Tabellen sollten erstellt werden, mit der vorgesehenen Spalte Typ für
id
:Nachdem Sie das getan haben, was haben Sie sich vorgenommen haben... die nächste Frage ist wohl "Wie mache ich meine foreign-key-Spalten der gleichen Spalte Typ?", da es keinen Sinn macht, primary key
people.id
alsbigint(20) unsigned
undperson_id
werdenint(11)
oder irgendetwas anderes?Für die Spalten, können Sie sich an die anderen Vorschläge, z.B.
UPDATE: @Notinlist, um beliebige Spalte für den Primärschlüssel auf beliebige Tabellen, die Sie tun müssen, um die
create_table-change_column
Tanz:z.B., wenn ich wollte
guid
anstelle von auto-Inkrement-zahlen,InformationsquelleAutor der Antwort choonkeat
Dies ist schwer für den Primärschlüssel mit Migrationen, weil die Schienen legt es automatisch.
Ändern können Sie jede Spalte später wie folgt:
change_column :foobars, :something_id, 'bigint'
Können Sie angeben, nicht-primär-IDs, die als benutzerdefinierte Typen, die in Ihrer ersten migration wie diese:
Wo ich "bigint" können Sie jeden text, der von Ihrer Datenbank verwenden würde, für die Datenbank-Spalte-Typ, den Sie verwenden möchten (z.B., "unsigned long").
Wenn Sie müssen Ihre id-Spalte, die eine vom Datentyp bigint, der einfachste Weg, es zu tun wäre, um die Tabelle zu erstellen, dann ändern Sie die Spalte in der gleichen migration mit change_column.
Mit PostgreSQL und SQLite -, schema-änderungen sind Atomare, damit diese nicht verlassen, Ihre Datenbank in einem seltsamen Zustand, wenn die migration fehlschlägt. Bei MySQL müssen Sie vorsichtiger sein.
InformationsquelleAutor der Antwort Luke Francl
Entsprechend der Rails API Dokumentation, die möglichen Optionen für Typ sind:
Können Sie verwenden :decimal, oder führen Sie einen Befehl direkt nutzen, wenn Sie:
Als wappos darauf hingewiesen, können Sie weitere Optionen wie :beschränken zu sagen, ActiveRecord, wie groß die Spalte sein. So würden Sie verwenden :int-Spalte mit einem größeren :limit.
InformationsquelleAutor der Antwort Yehuda Katz
Wenn jemand braucht dies funktioniert mit PostgreSQL, erstellen Sie einen Initialisierer wie diese:
Weil von lazy loading in Rails 3.2 (und vielleicht auch früheren Versionen)
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
ist nicht erforderlich, bis Sie den Aufbau der Datenbankverbindung.InformationsquelleAutor der Antwort Brandan
In
rails4
können Sie es tun.Folgenden ist ein Beispiel zum erstellen einer
Dummy
Modell inrails4
&postgres
,xxx_migrate_dummies.rb:
Was er Tat:
serial8
als id geben, die 64-bit-integer, und definieren es alsprimary key
.timestamptz
als datetime-Typ, in denen die timezone info, dies ist wichtig für eine Anwendung, die gehen über mehrere Zeitzonen.InformationsquelleAutor der Antwort Eric Wang
Rails 3, MySQL:
Nicht geben Sie mir eine bigint, nur ein int. Allerdings
funktioniert einwandfrei. (Obwohl es keine Band gibt mir MySQL.)
InformationsquelleAutor der Antwort Duke
Anleihen bei anderen Lösungen, angepasst für das, was für mich gearbeitet, vor kurzem.
Hinzufügen, um eine Datei in
config/initializers
. Es wird eine neue Spalte vom Typ (adaptiert von chookeat s Vorschlag).ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:long_primary_key] = "BIGINT(20) DEFAULT NULL auto_increment PRIMARY KEY"
Migrationen, verwenden Sie eine lange id sind wie folgt:
InformationsquelleAutor der Antwort z5h
Schrieb ich einen Juwel namens activerecord-native_db_types_override , ermöglicht das ändern der Datentypen, die verwendet werden, in Ihrer Migrationen.
In Ihrem Gemfile hinzufügen:
dann in config/environment.rb, zu lange ids in postgres hinzufügen:
Sehen, seine README für die up-to-date info.
InformationsquelleAutor der Antwort Gary S. Weaver
Kannst du es so machen:
InformationsquelleAutor der Antwort Alexander Gorg
Korrektur gewusst wie: ändern der Standard -
primary key
Spalte Typ:Statt:
sollten Sie tun:
sonst werden Sie nicht in der Lage, die
foreign key
Einschränkungen in der Datenbank-Schicht.InformationsquelleAutor der Antwort Alonzorz