Доступ к атрибуту родительского объекта из дочернего объекта в Rails - PullRequest
10 голосов
/ 17 января 2012

У меня есть модель под названием Category, которая выглядит следующим образом:

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

У меня есть представление, которое показывает все категории с некоторыми их атрибутами.Я могу получить доступ к category.parent_id, но я хотел бы иметь возможность делать что-то вроде category.parent_name.
Я вижу, как создаю метод модели для извлечения всех категорий и заполняю коллекцию соответствующим именем родителя каждой категории,но мне интересно, есть ли способ сделать это легко.

РЕДАКТИРОВАТЬ: Я изменил модель, чтобы она была такой:

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

Миграция для создания категорий таблиц выглядит следующим образом:

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

Однако, когда я передаю объект категории в представление, я не могу получить доступ к его родительским атрибутам, выполнив category.parent.name - Выполнение inspect этого объекта дает мне:

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

Иесли я проверяю category.parent, я получаю это:

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

Однако, если я пытаюсь сделать category.parent.name, я получаю следующую ошибку:

undefined method `name' for nil:NilClass

EDIT2: я былпытаясь получить доступ к родителю, который был нулевым, перед объектом, который я упомянул выше.Делаем это:

category.parent.try(:name) 

, как подсказал Майкл Ирвин , в одном из ответов это решено.

Ответы [ 2 ]

12 голосов
/ 17 января 2012

Ассоциативные ссылки в первый раз сложны ...

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

Тогда вы можете вызвать category.children и category.parent, а также получить доступ ко всем атрибутам связанных объектов, ...

6 голосов
/ 17 января 2012

Я не уверен, что полностью понимаю ваш вопрос, но category.parent.name должно работать.Если у категории нет родителя, сделайте что-то вроде category.parent.try(:name), чтобы избежать получения NoMethodError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...