2012-05-26 3 views
0

Tenir compte deux modèles:Impossible de décider si "le modèle A appartient au modèle B" OU "le modèle B appartient au modèle A"?

  1. User => (id: integer, nom: chaîne, created_at: datetime, updated_at: datetime, department_id: entier)
  2. Department => (id: entier, nom: chaîne, created_at: datetime, updated_at: datetime)

Maintenant, il existe une relation évidente entre ces deux tables. il est

  • Chaque User a un département
  • A Department appartient à de nombreux utilisateurs à savoir il y a plusieurs utilisateurs dans un seul département

, je choisis EAppuyez les mêmes que suivant que A belongs_to B

Mais comme vous le savez peut-être que cela ne fonctionne pas & renvoie l'erreur suivante:
class User < ActiveRecord::Base 
    has_one :department 
end 
class Department < ActiveRecord::Base 
    belongs_to :user 
end 
> @user = User.find(1) 
> @user.department.name 
    Department Load (1.0ms) SELECT "departments".* FROM "departments" WHERE "departments"."user_id" = 1 LIMIT 1 
ActiveRecord::StatementInvalid: PG::Error: ERROR: column departments.user_id does not exist 

Après beaucoup de succès & essai. Je suis tombé sur la bonne façon de définir ce qui est juste inverse i.e. B belongs to A

class Department < ActiveRecord::Base 
    has_many :users 
end 
class User < ActiveRecord::Base 
    belongs_to :department 
end 
> @user = User.find(1) 
> @user.department.name 
Department Load (1.0ms) SELECT "departments".* FROM "departments" WHERE "departments"."id" = 1 LIMIT 1 
=> "HR" 

Maintenant, cela est exact opposé de la façon dont mon cerveau pense à ces associations. Donc, je suis un peu confus, donc si quelqu'un pouvait expliquer ce qui se passe?

Pourquoi B belongs to A & PAS A belongs to B?

+0

Parce qu'il n'y a pas "belongs_to_many"? Un département a beaucoup d'utilisateurs - je pense juste à "belongs_to" comme un inverse nommé de cette relation. –

Répondre

1

La relation :has_one est un peu étrange au premier coup d'oeil. Considérons un utilisateur et un compte, chaque compte est connecté à (appartient à) un seul utilisateur, de l'autre côté, un utilisateur a un compte, un seul, son compte. Un compte est quelque chose que l'utilisateur possède.

Dans ces cas, vous utilisez la has_one rapport sur le modèle User et Rails recherchera une colonne user_id dans le tableau accounts (voir le has_one documentation dans le Guide Rails).

Dans votre cas, je pense qu'il est parfaitement exact de dire "un département a beaucoup d'utilisateurs" et "un utilisateur appartient à un département".

-1

Dans le premier exemple, vous devez ajouter la colonne & index à votre table dans le fichier de migration

class AddRelationToDeparments < ActiveRecord::Migration 
    def change 
    add_column, :deparments, :user_id, :integer 
    add_index, :deparments: :user_id 
    end 
end 
+0

Si un département a plusieurs utilisateurs, il n'aura certainement pas besoin d'user_id sur sa table. L'utilisateur, d'un autre côté, aura besoin d'un department_id mais l'OP l'a déjà. – Ashitaka

2

Vous avez eu tort de vos modèles.Ils devraient ressembler à ceci:

class User < ActiveRecord::Base 
    belongs_to :department 
end 

class Department < ActiveRecord::Base 
    has_many :users 
end 

Donc, pour ajouter un service à un utilisateur, vous pouvez le faire:

@user.department.create(:name => 'Science Department') 

Pour ajouter un utilisateur à un service, vous pouvez le faire:

@department.users.create(:name => 'John') 
Questions connexes