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.
dziękuję za odpowiedź. Dlaczego deklarujesz dwa klucze obce o tej samej nazwie w asocjacji has_many i belongs_to? – Nobita
Jest to jeden klucz obcy, ale widziany z dwóch różnych stron ... – davidb
Wyjaśniłem mój problem nieco dalej, korzystając z modyfikacji, które zasugerowałeś. Zobaczmy, co zrobię źle ... – Nobita