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.