77 votes

Est-ce que j'ai besoin de créer manuellement une migration pour une table de jointure HABTM ?

Je lutte actuellement pour faire fonctionner correctement HATBM. J'ai un scénario battu : des articles et des tags. Je présume que HABTM devrait être utilisé ici, car il s'agit d'une relation de nombreux à nombreux. Je ne sais cependant pas si je dois créer manuellement une table de jointure (articles_tags dans ce cas).

Mon code actuel est le suivant:

class Article < ActiveRecord::Base
  has_and_belongs_to_many :tags  
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :articles
end

Lorsque j'exécute les migrations, aucune 3ème table n'est créée. De plus, je tiens à ajouter que ma troisième table ne contient aucune logique de domaine, juste une affectation aveugle.

J'utilise Rails 2.2.2

141voto

Ryan Bigg Points 64561

Vous devriez faire cela dans une migration de l'une des tables, ou dans une migration distincte si ces migrations ont été exécutées :

create_table :articles_tags, :id => false do |t|
  t.references :article, :tag
end

add_index :articles_tags, [:article_id, :tag_id]

Cela créera la table pour vous et : id => false indique à Rails de ne pas ajouter de champ id à cette table. Il y a aussi un index, qui accélérera les recherches dans cette table de jointure.

Vous pourriez également générer un modèle (ArticlesTag) pour cela et faire :

# article.rb
has_many :articles_tags
has_many :tags, :through => :articles_tags

# tag.rb
has_many :articles_tags
has_many :articles, :through => :articles_tags

# article_tag.rb
belongs_to :tag
belongs_to :article

Et ensuite créer la table dans la migration générée par l'appel à script / generate model articles_tag.

8voto

Sai Perchard Points 645

7voto

Jack Chu Points 3795

Vous voudrez probablement ajouter un index à la migration :

add_index "articles_tags", "article_id"

add_index "articles_tags", "tag_id"

Cependant, si vous voulez une fonctionnalité de balisage, je recommande le plugin rails acts_as_taggable_on :

http://www.intridea.com/tag/acts_as_taggable_on http://github.com/mbleigh/acts-as-taggable-on/

Je l'ai utilisé sur un projet et il était très facile à mettre en place.

Un des problèmes avec une table de jointure pour le balisage est qu'elle peut rapidement devenir compliquée en créant une table de jointure pour chaque type de contenu que vous souhaitez rendre balisable (par ex. comments_tags, posts_tags, images_tags, etc). Ce plugin utilise une table taggings qui inclut un discriminant pour déterminer le type de contenu sans avoir besoin d'une table de jointure spécifique pour chaque type.

1voto

mArtinko5MB Points 176

En combinaison avec cette question (1ère réponse) Comment mettre en place une relation de rôles HABTM typique des utilisateurs et la première réponse d'ici, cela doit être compris même par un singe. Je suis nouveau dans RoR et ça fonctionne à merveille

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