2010-01-26 7 views
0

Je suit:rails belongs_to has_many s'il vous plaît expliquer

modèle

User avec des colonnes:

id  user_id  password  created_at  updated_at 

modèle Store avec des colonnes:

id  store_id store_name create_ad  updated_at 

Fondamentalement, un utilisateur peut appartenir à plusieurs magasins. Je ne voudrais donc d'obtenir une requête comme « obtenir tous les magasins que l'utilisateur appartient à »

relations que je l'ai fait sont:

class User < ActiveRecord::Base 
    belongs_to :store, :foreign_key => "store_id" 
end 

class Store < ActiveRecord::Base 
    has_many :user, :foreign_key => "store_id" 
end 

sont ces correctes? En fin de compte, je veux savoir si un ID utilisateur, mot de passe et storeid devrait pouvoir se connecter.

Alors, comment puis-je utiliser le find_byXXX à ce sujet? Donc, si je reçois une ligne avec passé dans ID utilisateur, mot de passe et storeId ... Je saurais si l'utilisateur devrait pouvoir se connecter?

J'ai remarqué que belongs_to et has_many questions ont déjà été posées mais je n'ai pas pu comprendre bien de ces questions. peut-être des réponses spécifiques à mon problème aideront ...

Répondre

0

Ainsi, vous avez dit qu'un utilisateur appartient à de nombreux magasins. Combien d'utilisateurs appartiennent à un seul magasin? Si la réponse est supérieure à 1, vous avez besoin de has_and_belongs_to_many et d'une troisième table de base de données. La table contiendra essentiellement des paires de (store_id, user_id).

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

Bien qu'il ne soit pas nécessaire par Rails, il est recommandé de créer un modèle pour cette relation et faire le bidirectionnel par rapport à ce modèle. Vous allez vous remercier plus tard.

class User < ActiveRecord::Base 
    has_many :userstores 
    has_many :stores, :through => :userstores 
end 

class Store < ActiveRecord::Base 
    has_many :userstores 
    has_many :users, :through => :userstores 
end 

class UserStore < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :store 
end 
+0

@BennyG "et de rendre la relation bidirectionnelle sur ce modèle." Parlez-vous de deux relations «has_many: through»? –

+0

Le nouveau modèle (UserStore) aura deux relations ': has_one'. Et oui, vous pouvez ajouter 'has_many: through' relations pour plus de commodité à la fois le modèle utilisateur et magasin. – BenG

0

Vous recherchez une relation has_and_belongs_to_many. Vos tables et modèle devraient être les suivants:

Tableau utilisateur:

id password created_at updated_at 

Table magasin:

id store_name created_at updated_at 

table de jointure (appelés stores_users):

store_id user_id 

Dans vos modèles :

class User < ActiveRecord::Base 
    has_and_belongs_to_many :stores 
end 

class Store < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

Pour obtenir d'un utilisateur magasins:

User.stores 

Voir the rails API pour plus d'informations.

+0

User.stores ne retourne pas mon rien il dit Undefined méthode 'magasins' – mustaine

+0

Avez-vous ajouté la table de jointure? – mjaz

0

Il semble que vous fassiez beaucoup de fausses hypothèses sur la façon dont ActiveRecords fonctionne sur un niveau de base, donc je vous recommande de lire le ActiveRecord Associations guide officiel et très simple.