rails中另一类别的类别子项

时间:2010-10-24 01:56:47

标签: ruby-on-rails ruby

如何在rails中实现一个可以成为另一个类别的子类的类别(自引用has_one)?

由于

2 个答案:

答案 0 :(得分:3)

首先,我相信你想要一个has_many关系,而不是has_one。我无法想象你希望类别在最多一个子类别的情况。之前的回答也只能给你一个方向 - 类别了解他们的父母,而不是他们的孩子。

完整的解决方案很简单。类别表应该有一个category_id列,模型应如下所示:

class Category < ActiveRecord::Base
  belongs_to :category
  has_many :categories
end

如果您想进一步向父母和孩子打电话,您可以:

class Category < ActiveRecord::Base
  belongs_to :parent, :class_name => 'Category', :foreign_key => 'category_id'
  has_many :children, :class_name => 'Category', :foreign_key => 'category_id'
end

祝你的应用好运!

答案 1 :(得分:0)

简单的方法是使用category_id的外键,正如其他人已经指出的那样。但是,如果你在谈论嵌套很多类别,这可能效率很低。 (注意:发布更多您的要求会有所帮助。)

我真的非常喜欢ancestry gem。以下是文档中的相关摘录(强调我的)。

  

从前面可以看出   部分,Ancestry存储一条路径   每个节点的父节点的根。   这是一个变种   物化路径数据库模式。的它   允许Ancestry获取任何关系   (兄弟姐妹,后代等)   单个sql查询没有   复杂的算法和   与...无关的不可理解性   左右值。另外,   任何插入,删除和更新   影响受影响的节点   节点自己的子树。

而且,这是一个奖励免费赠品,只是因为它不是立即显而易见的。如果您需要将兄弟姐妹视为具有职位的列表,您可以按如下方式对其进行调整。

acts_as_list :scope => 'ancestry #{(ancestry.blank? ? "IS NULL" : "=\'" + ancestry + "\'")}'