2012-01-17 11 views
9

Ho un modello chiamato Categoria che assomiglia a questo:Accesso oggetto padre attributo di oggetto del bambino in Rails

class Category < ActiveRecord::Base 
    has_many :categories 
    belongs_to :category,:foreign_key => "parent_id" 
end 

Ho una visione che mostra tutte le categorie con alcuni dei loro attributi. Posso accedere a category.parent_id, ma mi piacerebbe essere in grado di fare qualcosa come category.parent_name.
Posso vedere me stesso creando un metodo di modello per recuperare tutte le categorie e riempire la raccolta con il nome genitore corrispondente di ogni categoria, ma mi chiedo se c'è comunque modo di farlo facilmente.

EDIT: ho modificato il modello di avere in questo modo:

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 migrazione di creare le categorie della tabella è come questo:

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 

Tuttavia quando passo una categoria oggetto a una vista Non riesco ad accedere ai suoi attributi genitore facendo category.parent.name - Facendo un inspect di quell'oggetto mi dà:

<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"> 

E se faccio un ispezionare di category.parent ottengo questo:

#<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"> 

Tuttavia, se provo a fare category.parent.name ricevo il seguente errore:

undefined method `name' for nil:NilClass 

EDIT2: stavo cercando di accedere a un genitore che era nullo prima dell'oggetto che ho menzionato sopra. In questo modo:

category.parent.try(:name) 

come suggerito da Michael Irwin in una delle risposte risolto.

risposta

12

associazioni Auto referencing sono al la prima volta ...

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 

allora si potrebbe chiamare category.children e category.parent e anche accedere a tutti gli attributi dei oobjects asscoiated, ...

+0

davidb grazie per la risposta. Perché dichiarate due chiavi esterne con lo stesso nome nell'associazione has_many e belongs_to? – Nobita

+1

La sua chiave estranea ma vista da due lati diversi ... – davidb

+0

Ho spiegato un po 'più avanti il ​​mio problema usando le modifiche che hai suggerito. Vediamo se capisco cosa sto facendo male ... – Nobita

5

I' Non sono sicuro di aver capito completamente la tua domanda, ma category.parent.name dovrebbe funzionare. Se una categoria non ha un genitore, fai qualcosa come category.parent.try(:name) per evitare di ottenere un NoMethodError.

+0

Ho modificato la domanda per renderla più chiara. Grazie – Nobita

+0

non ho idea del perché non si sia verificato l'errore del metodo, ma questo ha aiutato molto. Grazie –

Problemi correlati