Rails:建模可以包含项目和列表的列表

时间:2014-08-21 05:08:30

标签: sql ruby-on-rails model nested hierarchy

我无法在Rails中为特定类型的列表建模。

基本上,我想为其成员包含其他列表或单个项目的列表建模。

我们说我有一张汽车零件表

Table Part
name
cost
color

让我们说一些部件列表非常常见,所以我想定义一些部件列表并重用这些部件。例如:

Table PartList
name

Table PartListItem
part_id
partList_id
position

现在,如果我想展示特定汽车所需的物品,我想要一个列表,其成员可能是给定汽车特有的物品,而成员则是可以找到的常见捆绑物品清单很多车。

可能看起来像这样:

适用于汽车的零件清单:
  - 发动机零件清单
  - 车身零件清单
  - 前保险杠
  - 后保险杠
  - 尾管
  - 安全合规部件清单

花式车零件清单:
  - 发动机零件清单
  - 车身零件清单
  - 闪亮的前保险杠
  - 闪亮的后保险杠
  - Wizbang尾管
  - 安全合规部件清单

如果我要修改'引擎'的部件列表?对汽车零件清单的查看将反映变化。无论列表的层次级别如何,列表都可能包含更多列表或单个项目。

一旦所有列表被扩展并且#39;他们的内容都是'部件'

我可能错了,但这不是完全递归,不完全是树,也不是完全嵌套的集合。感觉有点像菜单系统给我,但菜单的每个成员'可能有很多属性。

这种问题有解决方案吗?我很乐意接受一些,呃......如果它能促成我能理解的解决方案,就会缺乏干涩。

1 个答案:

答案 0 :(得分:1)

我似乎STIHABTM可以解决您的问题。

您想设计如下内容:

Car parts and lists diagram

Car可以有多个部分,Part可以是一个PartItemPartListPartList可以包含多个PartItem

在rails中它会是这样的:

# migrations
class CreateCars < ActiveRecord::Migration
  def change
    create_table :cars do |t|
      t.string :model
    end
  end
end

class CreateParts < ActiveRecord::Migration
  def change
    create_table :parts do |t|
      t.string :type # STI
      t.string :name
    end
  end
end

class CreateCarsParts < ActiveRecord::Migration
  def change
    create_table :cars_parts do |t|
      t.integer :car_id
      t.integer :part_id
    end
  end
end

class CreatePartListsPartItems < ActiveRecord::Migration
  def change
    create_table :part_lists_part_items do |t|
      t.integer :part_list_id
      t.integer :part_item_id
    end
  end
end

# models
class Car < ActiveRecord::Base
  has_and_belongs_to_many :parts
end

class Part < ActiveRecord::Base
  has_and_belongs_to_many :cars
end

class PartItem < Part
  has_and_belongs_to_many :part_lists,
                          join_table: :part_lists_part_items
end

class PartList < Part
  has_and_belongs_to_many :part_items,
                          join_table: :part_lists_part_items
end

希望有所帮助。