2010-03-04 4 views
2

J'ai cinq tables que je suis en train de se rendre au travail bien ensemble, mais avoir besoin d'aide.Eviter les données en double dans DB (pour une utilisation avec Rails)

J'ai trois tables principales:

  • Comptes
  • membres
  • et rôles.

Avec deux tables de jointure

  • account_members
  • et account_member_roles.

Le tableau des membres comptes et sont reliés par account_members (fk ACCOUNT_ID et member_id) la table.

Les 2 autres tables sont le problème (rôles et account_member_roles).

Un membre d'un compte peut avoir plus d'un rôle et je le account_member_roles (fk account_member_id et role_id) Table de rejoindre les account_members et la table de jointure rôles tableau.

Cela semble logique, mais pouvez-vous avoir une relation avec une table de jointure? Ce que je voudrais être en mesure de faire est lors de la création d'un compte, par exemple, je voudrais @ account.save pour inclure les rôles et mettre à jour la table compte_member_roles soigneusement ..... mais à travers le compte_members joindre la table.

J'ai essayé .....

accept_nested_attributes_for :members, :account_member_roles 

dans le account.rb mais je reçois .....

ActiveRecord::HasManyThroughCantAssociateThroughHasManyReflection (Cannot modify association 'Account#account_member_roles' because the source reflection class 'AccountMemberRole' is associated to 'AccountMember' via :has_many.) 

à essayer de sauver un record.

Des conseils sur la façon dont j'aborder ce sujet?

CIA

-ants

+0

Vous avez décrit comment vous résolvez un problème, mais vous n'avez pas décrit le problème que vous essayez de résoudre. @ Sleepycat (ci-dessous) a décrit un problème. Est-ce celui que vous essayez de résoudre? –

Répondre

0

Prenez une lecture ici: http://blog.hasmanythrough.com/2006/4/17/join-models-not-proxy-collections

La principale différence entre simple has_and_belongs_to_many table de jointure et un has_many: grâce à joindre modèle est que la Le modèle de jointure peut avoir des attributs autres que les clés étrangères pour les enregistrements qu'il joint.En fait, si vous n'avez pas ces autres attributs, vous n'utiliserez probablement pas de modèle de jointure et se contentera d'une table de jointure.

Il semblerait donc que vous vouliez utiliser has_many: through et que vous seriez paramétré.

+0

J'utilise has_many: thorugh. Peut-être que le problème est que la clé primaire pour le compte join * model * account_members n'a pas été créée avant d'essayer de créer le modèle join * model * account_member_roles. Cela semble être ma vraie question, puis-je avoir des modèles de jointure les uns avec les autres? – ants

+0

Je ne vois pas pourquoi pas, tant que vous pouvez gérer la complexité :) – Trevoke

1

Si je lis ceci correctement vous avez:

comptes HABTM membres

membres HABTM comptes

membres has_many rôles

Si cela est exact, vous avez juste besoin d'une table de jointure entre les comptes et membres, puis juste un FK régulier entre les membres et les rôles. @ account.members et @ account.members.roles vous donneront tous deux accès aux attributs dont vous avez besoin et @ account.save devrait sauver tout le gâchis sans faire d'histoires.

Je ne suis pas sûr de ce qui vous oblige à avoir cette table account_members_roles. Je ne sais pas si Rails peut gérer ça. Je sais que je ne peux pas. :)

+0

Je seconde cette solution, si Sleepycat a décrit le bon problème. –

Questions connexes