有一点帮助,如果你愿意的话.
我想用我的“产品”课来创建一个令人难以置信的关系.哪里可以有一种产品成为其他产品的母体产品.我的问题是如何在我的模型中创建这种关系?
这是否适合?
has_many :products belongs_to :product
解决方法
您的建议解决方案在逻辑上没有错误.但是,您可能需要执行以下操作:
belongs_to :parent,class_name: "Product",foreign_key: "parent_id" has_many :children,foreign_key: "parent_id"
您基本上存储一个“树”,一个产品在顶部,一些产品分支在下面,可能有很多级别.
您的示例中的策略被称为Adjacency List.很容易找到任何给定记录的直接父级和直接后代.然而,让所有的后裔(包括后代的后代)可能是困难的,并且树越深越难.
经常使用的一种替代方案是Nested Set,其中每个记录将关于对象的信息存储到“左”和“右”.这样就可以构建一个树,无论多大,漂亮很快(或至少在单个查询中有效).但是,更复杂的是,插入记录通常意味着必须重新计算并更新所插入记录右侧的所有记录.
第三个选项(可以说是一个中间位置)正在使用Path Enumeration,其中对象将其整个路径存储在树中.所以,给一棵树这样的:
A / \ B C | D
A将有一个空白路径(无父),B和C将具有路径A,D将具有路径A / C.这个解决方案大多数插入操作都比较便宜,查询很简单.然而,它在树上仍然相当复杂和移动的物体可能会变得昂贵.
还有其他选项,如Closure Tables.
如果一个简单的邻接列表适合您的需要,那么请继续.这绝对是最简单和最容易理解的.有一些宝石可以实现嵌套的集合,也可能是其他一些树型,所以如果你去那条路线,你就不用自己去做.