Javascript 如何遍历与多个表有关系的子表

Javascript 如何遍历与多个表有关系的子表,javascript,ruby-on-rails,ruby,Javascript,Ruby On Rails,Ruby,当我传递祖父母id或父母id以查找父图书表和子图书表中的所有相关图书时,如何遍历子图书表。我猜这更像是一个数据结构问题。我正在使用Activerecord从数据库中获取数据 表结构 大类 父类 儿童类 通常的方法是遍历整个子books数组,并在book列中搜索祖父母id 如果我选择parent\u id,也一样 范例 我通过Gon将@child_books对象传递到前端 Javascript 结果将是。如果我选择祖父母身份证。数学 祖父母=数学 父=代数、微积分 儿童=附加数学、离散数学 数学

当我传递祖父母id或父母id以查找父图书表和子图书表中的所有相关图书时,如何遍历子图书表。我猜这更像是一个数据结构问题。我正在使用Activerecord从数据库中获取数据

表结构

大类

父类

儿童类

通常的方法是遍历整个子books数组,并在book列中搜索祖父母id

如果我选择parent\u id,也一样

范例

我通过Gon将@child_books对象传递到前端

Javascript

结果将是。如果我选择祖父母身份证。数学

祖父母=数学

父=代数、微积分

儿童=附加数学、离散数学

数学

/

代数学

/\

附加数学离散数学

但是这种方法非常慢,如果儿童图书类别的数据集很大,比如说5000。然后为了找到这个关系,我必须一个接一个地遍历

我想的另一种方法是使用散列

@child_books = child_books.all()
@child_books.index_by(&:id)
这将产生这样的结果

 {
          
      1: {id: 1, name: “additional mathematics”, parent_id: 1, grandparent_id: 2 }
      2: {id: 2, name: “discrete mathematics”, parent_id: 1, grandparent_id: 2 }
        
  }
但是如果我通过祖父母id来搜索父母和孩子的书籍,这种方法就无法实现


解决这种关系问题的方法是什么。

TLDR;您的问题不太可能是在数据中搜索,而是在//代码中执行某些操作

就像@jad说的,很难说出你想做什么。引起我注意的是,当你说如果儿童图书类别的数据集很大,比如说5000是很小的。在大多数情况下,它甚至都不是一个规范

下面的内容可能不是您问题的直接解决方案

//让我们设置一些测试数据,不要太疯狂 //10万册儿童书籍 //10K家长书籍 //100本祖父母书 const getRandomInt=max=>Math.floorMath.random*Math.floormax 让grand_parent_category=.padStart100,'.split.mape,id=>{id,name:`math:${id}`} 让parent_category=.padStart10000,'.split.mape,id=>{id,name:`附加数学:${id}`,parent_id:getRandomIntgrand_parent_category.length} 让child_books=.padStart100000,,.split.mape,id=>{id,name:`child mathematics:${id}`,parent_id:getrandomintprent_category.length} //不计算处理时间内的设置,但它“接近即时” 让时间={} //映射数据并创建子存储桶以便于查找 times.startSetup=新日期 const grandrentmap=new Mapgrand\u parent\u category.mapele=>[ele.id,{…ele,children:[]] //映射父对象时,将父对象添加到祖父母以进行o1查找 const parentMap=new Mapparent\u category.mapele=>{ 如果祖父母map.hasele.parent\u id祖父母map.getele.parent\u id.children.pushele.id return[ele.id,{…ele,children:[]}] } //映射子对象时,将子对象添加到父对象以进行o1查找 const childMap=new Mapchild\u books.mapele=>{ 如果parentMap.hasele.parent\u id parentMap.getele.parent\u id.children.pushele.id 返回[ele.id,ele] } //找一位祖父母和他所有的子孙 const get祖父母=祖父母ID=>{ if!grandrentmap.hasgandrentid返回 让祖父母={…祖父母映射.get祖父母ID}//基于给定数据的浅克隆-安全 祖父母。孙辈=[] 祖父母.children=祖父母.children.mapparentID=>{ if!parentMap.hasparentID返回parentID 让parent={…parentMap.getparentID}//基于给定数据的浅克隆安全 //迭代这些子项,并将它们映射为祖父母、孙子孙女 parent.children.forEachchildID=>grandParent.孙子女.pushchildMap.haschildID?{…childMap.getchildID}:childID//浅克隆-基于给定的数据安全 返回父级 } 还祖父母 } times.finishSetup=新日期 让祖父母ID=42 times.startSearch=新日期 let results=get祖父母 times.finishSearch=新日期 console.log`祖父母${祖父母ID}有${results.children.length}子代和${results.sunderren.length}子代` console.log`Setup花费了${times.finishSetup-times.startSetup}ms` console.log`Search花费了${times.finishSearch-times.startSearch}ms` //样本运行 //祖父母42有97个孩子和991个孙子! //安装耗时60毫秒
//这是关于使用ruby还是使用javascript的问题?你能描述一下你想要实现什么,而不是你想要实现它的方式吗?为什么父母不直接知道祖父母的情况?为什么它是从子对象推断出来的?为什么没有sql示例?问题就在这里。
Id     name            parent_id.    grandparent_id.   
1.      Calculus book    1                 2
@child_books = child_books.all()
gon.child_books.forEach((book) => {
   If (book.grandparent_id == chosen_grandparent_id) {
      // do something
    } else if book.parent_id == chosen_parent_id {
      // do something
    } else if book.parent_id == children_id
});
@child_books = child_books.all()
@child_books.index_by(&:id)
 {
          
      1: {id: 1, name: “additional mathematics”, parent_id: 1, grandparent_id: 2 }
      2: {id: 2, name: “discrete mathematics”, parent_id: 1, grandparent_id: 2 }
        
  }