我的数据库中有一个类似于这个的表:
+----+--------+-----------------+
| id | parent | name |
+----+--------+-----------------+
| 1 | 0 | father 1 |
| 2 | 0 | father 2 |
| 3 | 1 | child 1 - 3 |
| 4 | 0 | father 4 |
| 5 | 2 | child 2 - 5 |
| 6 | 2 | child 2 - 6 |
| 7 | 1 | child 1 - 7 |
+----+--------+-----------------+
该列表的目的仅按主键(id)排序。逻辑很简单,如果父亲为0,那么它就是父类别,否则就是儿童或子女(等等)。
使用Ruby(Sinatra和DataMapper),我希望实现这个级联列表:
[
{
"id":1,
"parent":0,
"name":"father 1",
"childs":[
{
"id":3,
"parent":1,
"name":"child 1 - 3",
"childs":[ ]
},
{
"id":7,
"parent":1,
"name":"child 1 - 7",
"childs":[ ]
}
]
},
{
"id":2,
"parent":0,
"name":"father 2",
"childs":[
{
"id":5,
"parent":1,
"name":"child 2 - 5",
"childs":[ ]
},
{
"id":7,
"parent":1,
"name":"child 2 - 6",
"childs":[ ]
}
]
},
{
"id":4,
"parent":0,
"name":"father 4",
"childs":[ ]
}
]
我已经创建了Category类,如下所示......
class Category
include DataMapper::Resource
property :id, Serial
property :name, String, :length => 2..50, :required => true
property :parent, Integer, :default => 0
# All categories may have sub-categories
has n, :childs, 'Category', :parent_key => :id, :child_key => :parent, :constraint => :protect
end
我通过只向父母询问数据库来获取父母列表:
{ :data => Category.all(:parent => 0, :order => [ :name.asc ]), :total => Category.count(:parent=>0) }.to_json
但是我无法获得每个类别的孩子列表。
我可以创建一个递归"每个 - > Category.all"查询,但这将结束在一个只有100s行(每个父亲一个,每个孩子一个等)的表的许多查询,而不是只有几个。如果不是更好的方法,我可以缓存列表。
如何在没有大量查询的情况下为每个父级和每个子级(类别,可能包含子类别)自动加载和合并所有子级别?