我在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一样吗?
答案 0 :(得分:0)
你是对的,有很多父母不适合这些模特。你想要的是实现一个图形。根据你的描述,它可能是非循环的,也就是说它没有任何循环,或换句话说,页面永远不是自己的孩子,这可能导致某些优化。
这里使用的一般模式是页面之间的多对多关系。为此,您需要在parent
和child
之间创建连接模型。
作为改编自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那样高效,因为有很多关于缓存关系的信息,但如果性能是一个要求,你可以将其中一些功能移植到这个结构中。