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