E.E*_*.33 12 activerecord associations ruby-on-rails-3 ruby-on-rails-3.1
如果你愿意的话会有所帮助.
我想用我的'产品'类创建一个recusive relationsip.我可以将一种产品作为其他产品的母产品.我的问题是如何在我的模型中创建这种关系?
这是对的吗?
has_many :products
belongs_to :product
Run Code Online (Sandbox Code Playgroud)
Car*_*auf 42
您提出的解决方案在逻辑上没有任何问题.但是,您可能需要执行以下操作:
belongs_to :parent, class_name: "Product", foreign_key: "parent_id"
has_many :children, class_name: "Product", foreign_key: "parent_id"
Run Code Online (Sandbox Code Playgroud)
您基本上存储了一个"树",其中一个产品位于顶部,而子产品的分支位于下方,可能有很多层次.
您的示例中的策略称为邻接列表.很容易找到任何给定记录的直接父级和直接后代.然而,获得所有后代(包括后代的后代)可能很困难,并且树越深越难.
经常使用的替代方法是嵌套集,其中每个记录将关于对象的信息存储到它的"左"和"右".这允许您构建一个树,无论多大,很快(或者至少在单个查询中有效).但是,它更复杂,插入记录通常意味着必须重新计算并更新所插入记录右侧的所有记录.
第三种选择(可以说是一种中间地带)是使用Path Enumeration,其中对象将它们的整个路径存储在树中.所以,给这样一棵树:
A
/ \
B C
|
D
Run Code Online (Sandbox Code Playgroud)
A将有一个空白的路径(无父),B并且C将有路径A,D将有路径A/C.使用此解决方案,大多数插入操作相对便宜,查询非常简单.然而,它在树中仍然相当复杂和移动的物体可能变得昂贵.
还有其他选项,比如Closure Tables.
如果一个简单的邻接列表可以满足您的需求,那就去吧.这绝对是最简单和最容易理解的.有些宝石可以实现嵌套集,也可能用于其他一些树模式,所以如果你走这条路,你就不必自己做所有繁重的工作.