Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在RoR中使用循环图_Ruby On Rails_Ruby_Database_Graph_Graph Theory - Fatal编程技术网

Ruby on rails 在RoR中使用循环图

Ruby on rails 在RoR中使用循环图,ruby-on-rails,ruby,database,graph,graph-theory,Ruby On Rails,Ruby,Database,Graph,Graph Theory,我以前从未尝试过在Rails中使用图形,我对最佳方法很好奇。一些背景: 我正在制作一个Rails 3站点,并认为将某些对象及其关系存储为一个图形会很有趣,其中每个对象都是一个节点,一些对象连接起来以显示这两个对象是相关的。图中确实包含循环,并且图中的节点不会超过100-150个(可能仅接近50个)。一个节点可能不会有超过五条边,每个节点平均有三到四条边 我认为一个包含两列(每个列都是对象的ID)的简单联接表可能是最简单的方法,但我怀疑这是最好的方法。另一个想法是使用一个插件,比如acts_as_

我以前从未尝试过在Rails中使用图形,我对最佳方法很好奇。一些背景:

我正在制作一个Rails 3站点,并认为将某些对象及其关系存储为一个图形会很有趣,其中每个对象都是一个节点,一些对象连接起来以显示这两个对象是相关的。图中确实包含循环,并且图中的节点不会超过100-150个(可能仅接近50个)。一个节点可能不会有超过五条边,每个节点平均有三到四条边

我认为一个包含两列(每个列都是对象的ID)的简单联接表可能是最简单的方法,但我怀疑这是最好的方法。另一个想法是使用一个插件,比如acts_as_tree(它似乎没有针对Rails 3进行更新…)或者acts_as_tree_带有点的ID,但是我不确定它们是否能够处理循环而不是层次树

目前我最希望的是能够轻松地从一个节点遍历到它的兄弟节点。我真的想不出我想要遍历到节点的同级的原因,这就是为什么我考虑只创建一个SQL联接表的原因。我只想在站点上有一个部分来显示与指定对象相关的对象,这个图是我指定关系的方法之一


建议?我应该检查的东西?谢谢

我将使用两个SQL表,
node
link
,其中一个链接只是两个外键,源和目标。通过这种方式,您可以通过约束源或目标节点id来执行SQL select查询,从而获得到节点的入站或出站链接集。您可以进一步向两个表中添加“graph_id”列,以便在两个查询中检索图的所有数据,并将其作为后处理步骤进行构建


这个策略应该和查找、安装、学习使用和实现插件一样简单(如果不容易的话)。IMHO。

假设它是一个有向图,使用映射表,如

id | src | dest
其中,
src
dest
是对象表的FK

如果对象的类型不同,请让它们都继承一个ruby类或另一个表:

id | type | type_id
其中,
type
是对象的类型,
type\u id
是它在另一个表中的id

通过这样做,您应该能够为它指向的每个对象获取一个对象数组:

select dest 
from maptable 
where dest = self.id
如果需要知道其入站边缘,可以使用
src
而不是
dest
执行相同类型的查询

从那里,您应该能够轻松地编写您想要的任何图形算法。如果需要权重,可以修改映射表

id | src | dest | weight

取决于您主要关心的是图形上的操作还是图形的存储,您需要的可能是完全不同的。如果您想在图形上进行方便的操作,可以研究gem“rgl”(ruby图形库)。它实现了大多数基本的经典遍历和搜索算法

如果您处理的是大约150个节点,那么您可能可以在数据库本身或关联列表中使用最简邻接列表表示。然后,您可以将其输入到RGL中进行遍历和搜索操作


如果我没记错的话,RGL有足够的抽象,您可以使用现有的类结构,您只需提供获取相邻节点的方法。

您将在图形上执行哪些操作,即您希望Rails(或任何插件)为您提供什么?好问题,我本来应该把它包括进去的。我将用它来编辑主帖,但我目前最希望的是能够轻松地从一个节点遍历到它的兄弟节点。我真的想不出我想要遍历到节点的同级的原因,这就是为什么我考虑只创建一个SQL联接表的原因。我只想在站点上有一个部分来显示与指定对象相关的对象,这个图是我指定关系的方法之一。