我无法在Rails中为特定类型的列表建模。
基本上,我想为其成员包含其他列表或单个项目的列表建模。
我们说我有一张汽车零件表
Table Part
name
cost
color
让我们说一些部件列表非常常见,所以我想定义一些部件列表并重用这些部件。例如:
Table PartList
name
Table PartListItem
part_id
partList_id
position
现在,如果我想展示特定汽车所需的物品,我想要一个列表,其成员可能是给定汽车特有的物品,而成员则是可以找到的常见捆绑物品清单很多车。
可能看起来像这样:
适用于汽车的零件清单:
- 发动机零件清单
- 车身零件清单
- 前保险杠
- 后保险杠
- 尾管
- 安全合规部件清单
花式车零件清单:
- 发动机零件清单
- 车身零件清单
- 闪亮的前保险杠
- 闪亮的后保险杠
- Wizbang尾管
- 安全合规部件清单
如果我要修改'引擎'的部件列表?对汽车零件清单的查看将反映变化。无论列表的层次级别如何,列表都可能包含更多列表或单个项目。
一旦所有列表被扩展并且#39;他们的内容都是'部件'
我可能错了,但这不是完全递归,不完全是树,也不是完全嵌套的集合。感觉有点像菜单系统给我,但菜单的每个成员'可能有很多属性。
这种问题有解决方案吗?我很乐意接受一些,呃......如果它能促成我能理解的解决方案,就会缺乏干涩。
答案 0 :(得分:1)
您想设计如下内容:
Car
可以有多个部分,Part
可以是一个PartItem
或PartList
。 PartList
可以包含多个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
希望有所帮助。