模仿家庭与祖先的关系?

时间:2012-06-11 20:44:00

标签: ruby-on-rails ruby database-design

我在github上看了acts_as_tree和祖先的宝石,但我不认为他们做了我想做的事。我做了搜索,但找不到任何适合我尝试的东西。

所以,基本上只是一个带页面的CMS。页面是标题:字符串和正文:文本。页面可以嵌套在其他页面下,并可以嵌套其他页面。

因此,例如,所有这些都是“页面”

hardware
hardware/servers
hardware/servers/server1
hardware/servers/server1/parts/powersupply

理想情况下,我可以服务于孩子,也可以得到孩子或孙子女。

所以这很好。和acts_as_tree等对此很好。

但我想做的就是页面关系:

hardware/servers/server1
equipment/IT/server1
maintenance/monthly/server1/

friends/sally
coworkers/sally

所以,我想我希望它有很多父母?类似的东西。我希望能够从各种“路径”访问同一页面。

所以我不确定那会是什么样子。我会做某种类型的连接模型,因为有一些“has_many”,就像之前它只是parent_id一样吗?

1 个答案:

答案 0 :(得分:0)

你是对的,有很多父母不适合这些模特。你想要的是实现一个图形。根据你的描述,它可能是非循环的,也就是说它没有任何循环,或换句话说,页面永远不是自己的孩子,这可能导致某些优化。

这里使用的一般模式是页面之间的多对多关系。为此,您需要在parentchild之间创建连接模型。

作为改编自previous answer of mine的例子:

class Page < ActiveRecord::Base
  has_many :parent_page_links,
    :class_name => 'PageLink',
    :foreign_key => :child_id

  has_many :parents,
    :through => :parent_page_links,
    :source => :parent

  has_many :child_page_links,
    :class_name => 'PageLink',
    :foreign_key => :parent_id

  has_many :children,
    :through => :child_page_links,
    :source => :child
end

class PageLink < ActiveRecord::Base
  belongs_to :parent,
    :class_name => "Page"
  belongs_to :child,
    :class_name => "Page"
end

这不会像使用Ancestry那样高效,因为有很多关于缓存关系的信息,但如果性能是一个要求,你可以将其中一些功能移植到这个结构中。