2

我在 github 上查看了acts_as_tree 和 ancestry gems,但我不认为他们做我想做的事。我进行了搜索,但找不到任何适合我尝试的东西。

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

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

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

理想情况下,我可以 server.children 并获得孩子或孙子。

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

但是对于页面关系,我也想做的是:

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

或者

friends/sally
coworkers/sally

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

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

4

1 回答 1

0

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

这里使用的一般模式是页面之间的多对多关系。为此,您将在parent和之间创建一个连接模型child

作为改编自我以前的答案的一个例子:

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 那样有效,其中有很多关于为您缓存的关系的信息,但是如果性能是一个要求,您可以将其中一些功能移植到这个结构中。

于 2012-06-11T21:52:01.490 回答