2012-01-17 9 views
9

mam model o nazwie kategorii, która wygląda tak:Dostęp obiekt nadrzędny atrybutu od obiektu dziecka w Rails

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

Mam widoku, który pokazuje wszystkie kategorie z niektórymi z ich atrybutami. Mogę uzyskać dostęp do category.parent_id, ale chciałbym móc zrobić coś takiego jak category.parent_name.
Widzę siebie, tworząc modelową metodę pobierania wszystkich kategorii i wypełniania kolekcji odpowiednimi nazwami nadrzędnymi każdej kategorii, ale zastanawiam się, czy tak jest, aby to zrobić w prosty sposób.

EDIT: Mam zmodyfikowany model, aby mieć go tak:

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 

Migracja tworzyć kategorie tabela jest tak:

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 

jednak gdy mijam kategorię obiekt do widoku Nie mogę uzyskać dostępu do jego atrybutów nadrzędnych wykonując category.parent.name - Wykonanie inspect tego obiektu daje mi:

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

A gdybym wykonać inspekcję z category.parent uzyskać to:

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

Jednak gdy próbuję zrobić category.parent.name pojawia się następujący błąd:

undefined method `name' for nil:NilClass 

Edit2: Próbowałam uzyskać dostęp do obiektu macierzystego, który był zerowy przed obiektem, o którym wspomniałem powyżej. W ten sposób:

category.parent.try(:name) 

jak sugeruje Michael Irwin w jednej z odpowiedzi rozwiązać go.

Odpowiedz

12

stowarzyszenia Własna Odwoływanie się ciężko po raz pierwszy ...

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 

Następnie można nazwać category.children i category.parent a także dostęp do wszystkich atrybuty asscoiated oobjects ...

+0

dziękuję za odpowiedź. Dlaczego deklarujesz dwa klucze obce o tej samej nazwie w asocjacji has_many i belongs_to? – Nobita

+1

Jest to jeden klucz obcy, ale widziany z dwóch różnych stron ... – davidb

+0

Wyjaśniłem mój problem nieco dalej, korzystając z modyfikacji, które zasugerowałeś. Zobaczmy, co zrobię źle ... – Nobita

5

I nie jestem pewien, czy całkowicie rozumiem twoje pytanie, ale powinno zadziałać category.parent.name. Jeśli kategoria nie ma rodzica, zrób coś takiego jak category.parent.try(:name), aby uniknąć otrzymania NoMethodError.

+0

Zmieniłem to pytanie, aby było bardziej zrozumiałe. Dzięki – Nobita

+0

nie mam pojęcia, dlaczego nie ma błędu metody, ale to pomogło dużo. dzięki –

Powiązane problemy