(ruby)如何检索由parent_id级联的哈希列表?

时间:2014-11-06 14:52:32

标签: mysql sinatra associations parent-child ruby-datamapper

我的数据库中有一个类似于这个的表:

+----+--------+-----------------+
| 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行(每个父亲一个,每个孩子一个等)的表的许多查询,而不是只有几个。如果不是更好的方法,我可以缓存列表。

如何在没有大量查询的情况下为每个父级和每个子级(类别,可能包含子类别)自动加载和合并所有子级别?

0 个答案:

没有答案