gpt4 book ai didi

ruby-on-rails - 如何在 Ruby on Rails 中构建多级层次结构?

转载 作者:行者123 更新时间:2023-12-04 19:07:48 25 4
gpt4 key购买 nike

rails 应用程序包含许多不同的内容页面。页面被组织成称为部分的小组:

class Page < ActiveRecord::Base
attr_accessible: section_id #etc..
belongs_to :section
end

class Section < ActiveRecord::Base
attr_accessible :title #, etc...
has_many :pages
end

部分也需要组织起来,但最好的方法是什么 - 重新使用部分本身,或创建一个新的单元模型?

选项 1 - 重用部分
允许 Section 拥有子 Sections 和父 Sections。这样,您就不需要创建另一个具有与 Section 相似的字段的模型。一些部分将有_many 个页面,而其他部分将有_many 个子部分:
class Section < ActiveRecord::Base
attr_accessible :parent_id :title # etc...
has_many :pages

belongs_to :parent, class_name: "Section"
has_many :children, class_name: "Section", foreign_key: "parent_id"
end

选项 2 - 新单元型号
创建另一个名为 Unit 的模型来组织这些部分。它将有许多与部分相似的字段,但它将是一个明显独立的实体。
class Section < ActiveRecord::Base
attr_accessible :title, :unit_id # etc...
has_many :pages
belongs_to :units
end

class Unit < ActiveRecord::Base
attr_accessible :title # etc...
has_many :sections
end

选项 1 的优点是避免了一些重复,如果需要更多级别,可以在 future 进行调整。但是,选项 2 将具有_many 个页面的 Sections 与具有_many 个 Sections 的单元的角色明确分开,这可以帮助保持其他代码清晰。哪种方法最好?

更新
似乎选项 2 会有更清晰的代码,例如在浏览所有部分时。如果它会使某些代码更复杂,是否值得重用 Sections?例如,以下是如何以有组织的方式列出所有部分:

选项 2 - 对于每个单元,列出所有子部分。然后列出不在任何单元中的任何部分。

选项 1 - 对于每个父部分,列出所有子部分。然后列出没有父部分或子部分的任何部分。

最佳答案

如果您看到 Section 及其子项中定义的方法完全相同,则值得重用 Section(使用选项 1)。否则,您应该选择选项 2。

关于您对如何有条理地列出所有部分的担忧:

选项 1 - 这不是也可以完成,除非您想遍历一个包含父部分和子部分的集合。看看我们如何在下面的 ActiveRecord 中执行一些查询:

sections_with_parent = Section.joins(:parent)
sections_with_children = Section.joins(:children).uniq
parent_key_with_children_values = Section.joins(:children).uniq.inject({}) do |result, section|
result.merge({section => section.children})
end
sections_with_no_parent = Section.where(parent_id: nil)

选项 2 - 下面是一些与上面比较的代码:
sections_with_parent = Section.joins(:unit)
units_with_children = Unit.joins(:sections).uniq
parent_key_with_children_values = Unit.joins(:sections).uniq.inject({}) do |result, unit|
result.merge({unit => unit.sections })
end
sections_with_no_parent = Section.where(unit_id: nil)

如您所见,两个选项都有非常相似的用于列出 child 和 parent 的代码,因此在决定选择哪个选项时不必担心。

关于ruby-on-rails - 如何在 Ruby on Rails 中构建多级层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20223323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com