J’ai fais mes recherches sur les relations de type HABTM, mais il semble
que le has_many, :through soit plus adapté aux tables de jointure ayant
plusieurs champs.
Tes relations restent néanmoins du n-n, donc même avec des noms de
jointure customizées je te recommande très fortement du HABTM.
Note : sur une association HABTM nous disposons de :foreign_key
et :association_foreign_key si les clés étrangères ne suivent pas la
convention (ie. ‘user_id’ pour un User).
Cela devrait quand même réduire tes soucis de doublons ou de destroy.
Si ce n’est toujours pas le cas, tu disposes de :after_add
et :after_remove pour faire tes synchronisations manuellement.
Par ailleurs, tu peux forcer une clé d’unicité dans tes migrations sur
tes tables de jointure. À l’usage, cela te remontera une erreur au
lieu d’avoir des données bancales.
(les tables company_jobs et project_permissions sont des tables de
jointure)
Juste une remarque, je ne sais pas si c’est vraiment une convention,
mais j’ai toujours nommé les tables de jointures comme ça :
noms des 2 tables au pluriel
noms des tables par ordre alphabétique
Ce qui évite de définir le :through.
Pour franciser tout ceci, en gros, un projet appartient à une entreprise
et a plusieurs utilisateurs (lesquels appartiennent à différentes
entreprises).
Une entreprise peut offrir plusieurs services (Jobs) et un service peut
être fait dans différentes entreprises.
Question 1 : un projet peut-il être lié à plusieurs utilisateurs ? (On
dirait bien que “oui”)
Question 2 : “project_permissions” est-elle une simple table de
jointure ou possède-t-elle d’autres champs ?
S’il s’agit de simples tables de jointure, je te conseille de les
renommer en “companies_jobs” et “projects_users”.
De ce fait, ça te simplifie pas mal de choses :
class Project < ActiveRecord::Base
belongs_to :company
has_and_belongs_to_many :users
class User < ActiveRecord::Base
belongs_to :company
has_and_belongs_to_many :projects
class Company < ActiveRecord::Base
has_and_belongs_to_many :jobs
has_many :projects, :dependent => :destroy
has_many :users, :dependent => :destroy
class Job < ActiveRecord::Base
has_and_belongs_to_many :companies