Modèles et unicité

On 5 août, 10:35, Matthieu H. [email protected]
wrote:

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.

Exemple :

class Project < ActiveRecord::Base
belongs_to :company
has_and_belongs_to_many :users, :join_table => ‘project_permissions’

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.


Julien Vignolles

On 3 août, 14:59, Matthieu H. [email protected]
wrote:

(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


Julien Vignolles