Antworten:
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
stattdessen rails 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 Modelle has_and_belongs_to_many
bereits in der Datenbank enthalten sind: apples
und oranges
:
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables. Don't use the
# unique if you allow duplicates.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
Wenn Sie das :unique => true
für den Index verwenden, sollten Sie (in Rails3) :uniq => true
an übergeben has_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
und nunopolonia
korrekt: Es darf keine ID geben und es dürfen keine Zeitstempel oder Schienen vorhanden sein, die nicht has_and_belongs_to_many
funktionieren.
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:
# in migration
def self.up
create_table 'categories_products', :id => false do |t|
t.column :category_id, :integer
t.column :product_id, :integer
end
end
# models/product.rb
has_and_belongs_to_many :categories
# models/category.rb
has_and_belongs_to_many :products
Dies ist jedoch nicht sehr flexibel und Sie sollten über die Verwendung von has_many: through nachdenken
Die obere Antwort zeigt einen zusammengesetzten Index, von dem ich nicht glaube, dass er zum Nachschlagen von Äpfeln aus Orangen verwendet wird.
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables.
# This enforces uniqueness and speeds up apple->oranges lookups.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
# This speeds up orange->apple lookups
add_index(:apples_oranges, :orange_id)
Ich fand die Antwort, auf der 'The Doctor What' basiert, nützlich und die Diskussion sicherlich auch.
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.
Ich mache gerne:
rails g migration CreateJoinedTable model1:references model2:references
. Auf diese Weise erhalte ich eine Migration, die folgendermaßen aussieht:
class CreateJoinedTable < ActiveRecord::Migration
def change
create_table :joined_tables do |t|
t.references :trip, index: true
t.references :category, index: true
end
add_foreign_key :joined_tables, :trips
add_foreign_key :joined_tables, :categories
end
end
Ich mag es, Index für diese Spalten zu haben, weil ich oft nach diesen Spalten suche.
add_foreign_key
schlägt fehl, wenn es sich in derselben Migration befindet wie die, in der die Tabellen erstellt wurden.