2011-10-14 7 views
0

J'essaie de faire une association de base du modèle dans les rails. Fondamentalement, j'ai une table de liste qui stocke item_id et user_id. Un utilisateur peut créer plusieurs "éléments de liste".Rails association de base

Est-ce la bonne façon de le faire?

Merci.

class Item < ActiveRecord::Base 
    has_many :users, :through => :lists 
end 

class User < ActiveRecord::Base 
    has_many :items, :through => :lists 
end 


class List < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :item 
end 
+0

Oui, cela fonctionnera. Vous pouvez aussi avoir l'item 'belongs_to: list', la liste' belongs_to: user' et 'has_many: items', et l'utilisateur' has_many: lists'. –

Répondre

1

En fonction de ce que vous voulez atteindre, votre solution est la bonne (ou non). Je vois les cas suivants:

  1. Vous souhaitez créer une association n: m entre les éléments et les utilisateurs. Ainsi, chaque élément peut être référencé par de nombreux utilisateurs, et chaque utilisateur fait référence à de nombreux éléments. Si c'est le bon contexte, alors votre solution est la bonne. Voir le Rails Guides: Associations pour plus d'informations à ce sujet. Une alternative à cette situation pourrait être d'utiliser le has_and_belongs_to_many Association. La situation est la même, mais cela n'a pas de sens de parler de listes, il n'y aura pas d'objet modèle pour cela.
  2. Si chaque utilisateur peut avoir plusieurs listes et que chaque liste peut contenir plusieurs éléments, votre solution serait erronée. Ce ne serait pas n: m association avec liste comme la table de jointure entre, mais deux relations 1: n.

Le code pour le troisième exemple ressemblerait que:

class User < ActiveRecord::Base 
    has_many :items, :through => :lists 
    has_many :lists 
end 

class List < ActiveRecord::Base 
    has_many :items 
    belongs_to :user 
end 

class Item < ActiveRecord::Base 
    belongs_to :list 
end 

Dans la première solution, vous devez ajouter les relations pour les utilisateurs aux listes et aux articles à la liste:

class Item < ActiveRecord::Base 
    has_many :lists 
    has_many :users, :through => :lists 
end 

class User < ActiveRecord::Base 
    has_many :lists 
    has_many :items, :through => :lists 
end 
0

Si l'entité "list" est vraiment une pure association/jointure, c'est-à-dire qu'elle n'a pas d'attributs propres, alors vous pouvez simplifier un peu et utiliser has_and_belongs_to_many. Ensuite, vous n'avez pas besoin d'une classe "List".

class Item < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :items 
end 

Rails chercher les références dans une table « items_users », donc dans votre migration, vous devez créer à la:

create_table :items_users, :id => false do |t| 
    t.references :users, :items 
end 

Beaucoup de gens vous diront toujours utiliser has_many: à travers, mais d'autres (comme moi) seront en désaccord - utiliser le bon outil pour le travail.