2012-01-17 18 views
9

Tengo un modelo llamado Categoría que se parece a esto:Acceso objeto principal atributo de objeto del niño en los carriles

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 al category.parent_id, pero me gustaría poder hacer algo como category.parent_name.
Me veo creando un método modelo para buscar todas las categorías y completar la colección con el nombre principal correspondiente de cada categoría, pero me pregunto si hay alguna forma de hacerlo fácilmente.

EDIT: He modificado el modelo para tener de esta manera:

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 la tabla 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 una categoría objetar a una vista No puedo acceder a sus atributos principales haciendo category.parent.name - Haciendo un inspect 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 no un inspeccionar de category.parent me sale 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 intento hacer category.parent.name me sale el siguiente error:

undefined method `name' for nil:NilClass 

Edit2: yo estaba tratando de acceder a un padre que era nulo antes del objeto que mencioné anteriormente. Hacer esto:

category.parent.try(:name) 

como sugiere Michael Irwin en una de las respuestas resuelto.

Respuesta

12

asociaciones autorreferenciados son difíciles en la primera vez ...

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 

entonces se podría llamar category.children y category.parent y también acceder a todos los atributos de los oobjects asscoiated, ...

+0

davidb gracias por la respuesta. ¿Por qué declaras dos claves externas con el mismo nombre en la asociación has_many y belongs_to? – Nobita

+1

Es una clave foránea pero se ve desde dos lados diferentes ... – davidb

+0

He explicado mi problema un poco más con las modificaciones sugeridas. Veamos si me doy cuenta de lo que estoy haciendo mal ... – Nobita

5

I' No estoy seguro de entender por completo su pregunta, pero category.parent.name debería funcionar. Si una categoría no tiene un padre, haga algo como category.parent.try(:name) para evitar obtener un NoMethodError.

+0

He editado la pregunta para que quede más clara. Gracias – Nobita

+0

ni idea de por qué no ocurre el error de método, pero esto ayudó mucho. Gracias –

Cuestiones relacionadas