我有一个名为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:我试图在我上面提到的对象之前访问一个nil的父级。这样做:
category.parent.try(:name)
Michael Irwin 在其中一个答案中解决了它。
答案 0 :(得分:12)
第一次自我引用关联很难......
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
并访问相关的oobjects的所有属性,...
答案 1 :(得分:6)
我不确定我是否完全理解您的问题,但category.parent.name
应该有效。如果某个类别没有父级,请执行category.parent.try(:name)
之类的操作,以避免获得NoMethodError
。