Wie script/generate migration
erstelle ich eine Verknüpfungstabelle für eine has_and_belongs_to_many
Beziehung?
Die Anwendung läuft auf Rails 2.3.2, aber ich habe auch Rails 3.0.3 installiert.
Wie script/generate migration
erstelle ich eine Verknüpfungstabelle für eine has_and_belongs_to_many
Beziehung?
Die Anwendung läuft auf Rails 2.3.2, aber ich habe auch Rails 3.0.3 installiert.
Wo:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
und
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
für Schienen 4:
rails generate migration CreateJoinTableStudentTeacher student teacher
für Schienen 3:
rails generate migration students_teachers student_id:integer teacher_id:integer
für Schienen <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(Beachten Sie, dass der Tabellenname beide Join-Tabellen in alphabetischer Reihenfolge auflistet.)
und dann müssen Sie nur für Schienen 3 und darunter Ihre generierte Migration bearbeiten, damit kein ID-Feld erstellt wird:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
stattdessenrails generate migration CreateJoinTableStudentTeacher student teacher
, ist das das gleiche? Muss S (tudent) vor T (jeweils) stehen?Eine
has_and_belongs_to_many
Tabelle muss diesem Format entsprechen. Ich gehe davon aus, dass die beiden zu verbindenden Modellehas_and_belongs_to_many
bereits in der Datenbank enthalten sind:apples
undoranges
:Wenn Sie das
:unique => true
für den Index verwenden, sollten Sie (in Rails3):uniq => true
an übergebenhas_and_belongs_to_many
.Weitere Informationen: Rails Docs
AKTUALISIERT 13.12.2010 Ich habe es aktualisiert, um die ID und die Zeitstempel zu entfernen ... Grundsätzlich
MattDiPasquale
undnunopolonia
korrekt: Es darf keine ID geben und es dürfen keine Zeitstempel oder Schienen vorhanden sein, die nichthas_and_belongs_to_many
funktionieren.quelle
script/generate migration
...Sie sollten der Tabelle die Namen von 2 Modellen benennen, die Sie in alphabetischer Reihenfolge verbinden möchten, und die beiden Modell-IDs in die Tabelle einfügen. Verbinden Sie dann jedes Modell miteinander, um die Assoziationen im Modell zu erstellen.
Hier ist ein Beispiel:
Dies ist jedoch nicht sehr flexibel und Sie sollten über die Verwendung von has_many: through nachdenken
quelle
Die obere Antwort zeigt einen zusammengesetzten Index, von dem ich nicht glaube, dass er zum Nachschlagen von Äpfeln aus Orangen verwendet wird.
Ich fand die Antwort, auf der 'The Doctor What' basiert, nützlich und die Diskussion sicherlich auch.
quelle
In Schienen 4 können Sie einfach verwenden
create_join_table: table1s ,: table2s
das ist alles.
Achtung: Sie müssen Tabelle1, Tabelle2 mit alphanumerischen Zeichen versehen.
quelle
Ich mache gerne:
rails g migration CreateJoinedTable model1:references model2:references
. Auf diese Weise erhalte ich eine Migration, die folgendermaßen aussieht:Ich mag es, Index für diese Spalten zu haben, weil ich oft nach diesen Spalten suche.
quelle
add_foreign_key
schlägt fehl, wenn es sich in derselben Migration befindet wie die, in der die Tabellen erstellt wurden.