2010-11-19 6 views
1

J'ai une jolie question sur une relation plusieurs-à-plusieurs que j'ai créée et je tire les bonnes données de l'enfant.Rails - Relation plusieurs-à-plusieurs - Problème de données?

Ce que j'ai est 2 modèles, un appelé Ordre et un autre état. J'ai une migration nommée CreateOrdersStatuses pour joindre les deux tables.

Dans la console rubis, je vais avoir des difficultés tirant des informations de l'enfant par le parent, par exemple:

J'ai assigné ma première commande un statut, et la console me donne ce qui suit donne lecture:

ruby-1.9.2-p0 > order.statuses 
=> [#<Status id: 1, name: "New", created_at: "2010-11-18 20:19:12", updated_at: "2010-11-18 20:19:12">] 

Cependant, pour moi, je suis en train d'afficher l'état, donc je l'ai essayé ce qui suit dans la console order.statuses.name d'une commande - que je pensais me donner l'impression de " Nouveau". Au lieu de cela je suis seulement capable de tirer "Statut" en essayant ceci. Par exemple:

ruby-1.9.2-p0 > order.statuses.name 
=> "Status" 

Je crois que mon problème est lié à la syntaxe lorsque j'essaie d'extraire le nom d'état de ma commande? Je peux fournir les modèles/migrations si nécessaire, je pensais juste que c'est un problème de syntaxe puisque je suis un newb :).

Merci à tous.

+0

Juste une question, êtes-vous sûr un many relation to-many est correcte dans ce cas? Si un ordre peut avoir plusieurs statuts en même temps, par exemple, il peut être à la fois Nouveau, En cours et Fermé simultanément, ce qui ne me semble pas correct. Je suggérerais que vous le changiez en une association belongs_to où un ordre appartient à un statut et qu'un statut a beaucoup d'ordres. – DanneManne

Répondre

0

order.statuses.name ne retournera pas "Nouveau", car order.statuses est une collection (vous voyez des crochets rectangulaires dans votre première sortie). Donc, il n'y a aucun sens à faire order.statuses.name. Vous pouvez par exemple faire order.statuses[0].name.

Néanmoins, order.statuses.name ne génère pas d'erreur, car une association a en fait une méthode name qui renvoie le nom de la classe de l'association. Dans votre cas, la classe de l'association statuses est Status, donc cette méthode renvoie "Status".

+0

Merci beaucoup neutrino. Cela a du sens monsieur, je l'apprécie vraiment. Je lui demandais essentiellement de me dire le nom de la collection de statuts que j'avais créée, ne demandant pas le "nom" du premier objet dans le tableau? Merci encore une fois, je suis vraiment reconnaissant. – Kombo

0

Pour éviter la notation d'index-tableau dégueu "[0]", vous pouvez le faire à la place:

order.statuses.first.name 

en supposant que votre modèle de commande

has_many :statuses 
+0

Il est réglé sur has_and_belongs_to_many, donc cela aussi fonctionnera. Une question rapide liée à ceci si vous savez: Quand je crée ma nouvelle commande, ils ne sont associés à aucun statut pour commencer. Y at-il un moyen de le configurer ainsi quand je crée un ordre, une relation initiale est définie est définie sur mon premier statut? Je n'ai pas eu de chance de définir un: par défaut dans la migration, probablement parce que mon modèle de commande n'inclut pas de statut fk. – Kombo

+0

vous pouvez ajouter une méthode nommée 'initialize' au modèle, où vous pouvez définir un statut associé si aucun n'est déjà défini. Les valeurs par défaut sur les modèles sont difficiles dans Rails. Il y a aussi des hooks de rappel comme 'before_initialize' ou 'after_initialize' que vous voudrez peut-être essayer. – nessur