如何在rails中实现一个可以成为另一个类别的子类的类别(自引用has_one)?
由于
答案 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 + "\'")}'