Bon le titre est un peu capilo-tracté. L'explication qui va suivre presque tout
autant.
Imaginons vous avez un model User et un model Book. On veut modéliser une
relation "à participé à la rédaction de" et une relation "à lu". Dans ce cas
des tables de jointure s'impose.
Pour une table de jointure pas de problème, on suit les conventions : (nom
des models au pluriel triés par ordre alphabétique et séparés par "_"). Mais
dans ce cas nous avons deux tables de jointure et nous ne voulons pas confondre
les données. Voici comment procéder :
Créer les tables de jointure :
rails g migration join_table_users_books
Ouvrez le fichier générer et mettez-y la création des tables de
jointure
def up create_table :reading, :id => false do |t| t.integer :user_id t.integer :book_id end add_index :reading, [:user_id, :book_id] create_table :writing, :id => false do |t| t.integer :user_id t.integer :book_id end add_index :writing, [:user_id, :book_id] end def down drop_table :reading drop_table :writing end
Ensuite ajoutez les relations habtm dans les models :
class User < ActiveRecord::Base has_and_belongs_to_many :readed_books, :class_name => "Book", :join_table => "reading" has_and_belongs_to_many :written_books, :class_name => "Book", :join_table => "writing" end class Book < ActiveRecord::Base has_and_belongs_to_many :readed_by_users, :class_name => "User", :join_table => "reading" has_and_belongs_to_many :written_by_users, :class_name => "User", :join_table => "writing" end
Vous pouvez maintenant faire :
User.first.readed_books User.first.readed_book_ids u = User.first u.readed_books << Book.limit(3).all u.save
Voilà il ne reste plus qu'à appliquer ceci dans votre cas.