Accéder à l'objet parent de l'attribut de l'enfant de l'objet dans les Rails
J'ai un modèle appelé Catégorie qui ressemble à ceci:
class Category < ActiveRecord::Base
has_many :categories
belongs_to :category,:foreign_key => "parent_id"
end
J'ai une vue qui montre toutes les catégories avec certains de leurs attributs. Je peux accéder à category.parent_id
, mais je voudrais être en mesure de faire quelque chose comme category.parent_name
.
Je peux me voir création d'un modèle de méthode pour récupérer toutes les catégories et de remplissage de la collection avec le correspondant parent nom de chaque catégorie, mais je me demandais si il n'y a de toute façon de le faire facilement.
EDIT: j'ai modifié le modèle, comme ceci:
class Category < ActiveRecord::Base
has_many :children, :class_name => 'Category', :foreign_key => 'parent_id'
belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id'
end
La migration pour créer la table des catégories, c'est comme cela:
class CreateCategories < ActiveRecord::Migration
def change
create_table :categories do |t|
t.string :name
t.text :description
t.integer :parent_id
t.timestamps
end
end
end
Cependant lorsque je passe d'une catégorie d'objet à un point de vue, je ne suis pas en mesure d'accéder à ses attributs parents en faisant category.parent.name
- Faire un inspect
de cet objet me donne:
<Category id: 2, name: "Test 2", description: "Prova 2", parent_id: 1, created_at: "2012-01-17 19:28:33", updated_at: "2012-01-17 19:28:33">
Et si je fais un contrôle de category.parent
j'obtiens ceci:
#<Category id: 1, name: "Prova", description: "Test", parent_id: nil, created_at: "2012-01-17 19:28:17", updated_at: "2012-01-17 19:28:17">
Cependant, si j'essaie de faire category.parent.name
j'obtiens l'erreur suivante:
undefined method `name' for nil:NilClass
EDIT2: j'ai essayé d'accéder à un parent qui a été de néant avant que l'objet que je l'ai mentionné ci-dessus. Pour ce faire:
category.parent.try(:name)
comme suggéré par Michael Irwin dans l'une des réponses résolu.
OriginalL'auteur Nobita | 2012-01-17
Vous devez vous connecter pour publier un commentaire.
Auto référencement associations sont dur à la première fois...
Vous pouvez ensuite appeler
category.children
etcategory.parent
et d'accéder à tous les attributs de la asscoiated oobjects,...Ses une clé étrangère, mais vu à partir de deux côtés différents...
J'ai expliqué mon problème un peu plus loin en utilisant les modifications que vous avez suggéré. Voyons voir si je comprendre ce que je fais mal..
OriginalL'auteur davidb
Je ne suis pas sûr que je comprends très bien votre question, mais
category.parent.name
devrait fonctionner. Si une catégorie n'ont pas de parent, de faire quelque chose commecategory.parent.try(:name)
pour éviter d'avoir unNoMethodError
.aucune idée de pourquoi pas de la méthode d'erreur se produit, mais cela a aidé beaucoup. merci
OriginalL'auteur Michael Irwin