【问题标题】:How to get all the descendants of an object in Ruby on Rails如何在 Ruby on Rails 中获取对象的所有后代
【发布时间】:2015-11-20 20:42:47
【问题描述】:

我有以下相关模型:

GrandParent 
  has_many :kids
  has_many :grand_children, through: :kids
Kid 
  belongs_to :grand_parent
  has_many :grand_kids
GrandKid
  belongs_to :kid

我只想在一个对象上调用 .descendants,并获取属于其“世系”的所有对象。

我认为使用祖先 gem 会给我想要的 .descendants 方法,但它只会在单个类上创建一个额外的索引,允许您在该类中获取后代。(非常适合 cmets 和回复,但对我的问题没有用)我的代码并不是理解问题所必需的,但这里是为那些感兴趣的人准备的:https://gist.github.com/bjlinville1/8425bfe88bc7060209e8

【问题讨论】:

  • 我只建议将您的帖子缩短到理解问题所需的最少代码量。这是一个很好的问题,但过多的细节让 Q 失去了意义。您可能希望将您的 MVC 代码包含在 gisthub gist 中。
  • 感谢 Hunter,为了清楚起见,我编辑了问题,并为它做了一个要点,并包含了简化的 MVC。
  • Ben,如果您使用祖先,您只需要创建一个模型“Person”,树中的关系将确定实例是祖父母、孩子、孙子等。

标签: ruby-on-rails ruby tree children ancestry


【解决方案1】:

我相信您对祖先宝石的解释不正确。 看起来您希望 Region 会显示为 Country 的子级。对吗?

祖先对于树状结构很有用(想想文件夹 -> 子文件夹 -> 子子文件夹 -> 等等)

在您的 Country 模型中应用 has_ancestry 将允许您在国家/地区内创建国家/地区。但我不相信这就是你要找的东西。

无论如何,您可以通过在控制器中创建/更新国家/地区时为国家/地区设置“parent_id”属性来设置这些关系。只需将其设置为父国家/地区的 ID。 如果您想要区域的树形结构,区域也一样。

【讨论】:

  • 谢谢,这正是我认为祖先会为我做的事情。我不确定我是否可以使用 parent_ids 来完成我的“祖先-后代”表,但我现在只需手动编码每个视图就可以正常工作。如果您 - 或其他任何人 - 知道编写该表的一种很好的 DRY 方式,以便我可以在几个“后代”显示页面上使用它,我将不胜感激。
  • 你有一个“区域”控制器实现了“显示”操作吗?
  • 我已更新原始问题以包含区域控制器和区域 show.html.haml
  • 这超出了原始问题的范围,因此您可能应该提交一个新问题以获得更好的答案。目前,您正在寻找的可能可以通过视图部分解决:guides.rubyonrails.org/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2011-11-19
  • 2012-11-07
相关资源
最近更新 更多