Jak script/generate migration
utworzyć tabelę łączenia w has_and_belongs_to_many
związku?
Aplikacja działa na Railsach 2.3.2, ale mam też zainstalowane Rails 3.0.3.
Jak script/generate migration
utworzyć tabelę łączenia w has_and_belongs_to_many
związku?
Aplikacja działa na Railsach 2.3.2, ale mam też zainstalowane Rails 3.0.3.
Gdzie:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
i
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
dla szyn 4:
rails generate migration CreateJoinTableStudentTeacher student teacher
dla szyn 3:
rails generate migration students_teachers student_id:integer teacher_id:integer
dla szyn <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(zwróć uwagę, że nazwa tabeli zawiera obie tabele łączenia w kolejności alfabetycznej)
a następnie tylko dla szyn 3 i niższych, musisz edytować wygenerowaną migrację, aby pole identyfikatora nie zostało utworzone:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
zamiastrails generate migration CreateJoinTableStudentTeacher student teacher
, czy to to samo? Czy S (tudent) musi przed T (eacher)?has_and_belongs_to_many
Stół musi pasować ten format. Zakładam, że dwa modele, które mają zostać połączone,has_and_belongs_to_many
są już w bazie danych:apples
ioranges
:Jeśli używasz
:unique => true
indeksu, powinieneś (w rails3) przejść:uniq => true
dohas_and_belongs_to_many
.Więcej informacji: Rails Docs
ZAKTUALIZOWANO 2010-12-13 Zaktualizowałem go, aby usunąć identyfikator i znaczniki czasu ... Zasadniczo
MattDiPasquale
inunopolonia
są one poprawne: nie może być identyfikatora i nie może być znaczników czasu ani szyn, które nie pozwoląhas_and_belongs_to_many
działać.źródło
script/generate migration
...Powinieneś nazwać tabelę nazwami 2 modeli, które chcesz połączyć w kolejności alfabetycznej i umieścić dwa identyfikatory modeli w tabeli. Następnie połącz każdy model ze sobą, tworząc w modelu skojarzenia.
Oto przykład:
Ale to nie jest zbyt elastyczne i powinieneś pomyśleć o użyciu has_many: through
źródło
Górna odpowiedź pokazuje złożony indeks, który, jak sądzę, nie będzie używany do wyszukiwania jabłek z pomarańczy.
Uznałem, że odpowiedź, na podstawie której jest to oparte na „Doktorze What”, jest użyteczna i dyskusja z pewnością również.
źródło
W szynach 4 można łatwo używać
create_join_table: table1s,: table2s
to wszystko.
Uwaga: tabelę1, tabelę2 należy wyłączyć alfanumerycznie.
źródło
Lubię robić:
rails g migration CreateJoinedTable model1:references model2:references
. W ten sposób otrzymuję migrację, która wygląda następująco:Lubię mieć indeksy w tych kolumnach, ponieważ często będę wyszukiwać za pomocą tych kolumn.
źródło
add_foreign_key
zakończy się niepowodzeniem, jeśli zostanie umieszczony w tej samej migracji, co ta, która utworzyła tabele.