Acceso al atributo del objeto padre desde el objeto del niño en Rails
Tengo un modelo llamado Categoría que se ve así:
class Category < ActiveRecord::Base
has_many :categories
belongs_to :category,:foreign_key => "parent_id"
end
Tengo una vista que muestra todas las categorías con algunos de sus atributos. Puedo acceder acategory.parent_id
, pero me gustaría poder hacer algo comocategory.parent_name
.
Puedo verme creando un método modelo para buscar todas las categorías y llenar la colección con el nombre principal correspondiente de cada categoría, pero me pregunto si hay alguna forma de hacerlo fácilmente.
EDITAR He modificado el modelo para tenerlo así:
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 migración para crear las categorías de tablas es la siguiente:
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
Sin embargo, cuando paso un objeto de categoría a una vista, no puedo acceder a sus atributos principales haciendocategory.parent.name
- Haciendo unainspect
de ese objeto me da:
<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">
Y si hago una inspección decategory.parent
Entiendo esto
#<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">
Sin embargo, si trato de hacercategory.parent.name
Obtuve el siguiente error
undefined method `name' for nil:NilClass
EDIT2: estaba intentando acceder a un padre que era nulo antes del objeto que mencioné anteriormente. Haciendo esto
category.parent.try(:name)
como lo sugirióMichael Irwin en una de las respuestas lo resolvió.