126 votes

Migration de rails pour has_and_belongs_to_many table de jointure

Comment faire un pour créer une table de jointure pour un relation ?

L’application s’exécute sur Rails 2.3.2, mais j’ai aussi des Rails 3.0.3 installé.

231voto

dangerousdave Points 2019

Où:

class Teacher < ActiveRecord::Base
  has_and_belongs_to_many :students
end

et

class Student < ActiveRecord::Base
  has_and_belongs_to_many :teachers
end

pour les rails 4:

rails generate migration CreateJoinTableStudentTeacher student teacher

pour rails 3:

rails generate migration students_teachers student_id:integer teacher_id:integer

pour les rails < 3

script/generate migration students_teachers student_id:integer teacher_id:integer

(notez le nom de la table répertorie à la fois les tables de jointure dans l'ordre alphabétique)

et puis pour rails 3 et ci-dessous, vous devez modifier votre générés migration donc un champ id n'est pas créée:

create_table :students_teachers, :id => false do |t|

139voto

The Doctor What Points 4454

Un has_and_belongs_to_many tableau doit correspondre à ce format. Je suis en supposant que les deux modèles d'être rejoint par has_and_belongs_to_many sont déjà dans la base de données : apples et 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)

Si vous utilisez l' :unique => true sur l'indice, alors vous devriez (en rails3) pass :uniq => true de has_and_belongs_to_many.

Plus d'informations: Rails Docs

Mise à JOUR 2010-12-13 je l'ai mis à jour pour supprimer les id et les horodatages... Fondamentalement MattDiPasquale et nunopolonia sont corrects: Il ne doit pas être un id et il ne doit pas être horodateurs ou des rails de ne pas autoriser has_and_belongs_to_many de travail.

14voto

nunopolonia Points 5218

Vous devez nommer le tableau les noms des 2 modèles, que vous voulez vous connecter par ordre alphabétique et mettre l’id modèle à deux dans la table. Puis connectez chaque modèle à l’autre créant les associations dans le modèle.

Voici un exemple :

Mais ce n’est pas très flexible et vous devriez penser à l’aide de has_many : par le biais

6voto

Joseph Lord Points 250

La réponse en haut de la page affiche un indice composite qui je ne crois pas est utilisé avec des pommes recherche d’oranges.

J’ai trouvé la réponse à ceci est basé sur « The Doctor quoi » utiles et la discussion donc certainement trop.

5voto

zw963 Points 11

Dans rails 4, vous pouvez utiliser simple

create_join_table : table1s, : table2s

C’est tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X