祖先宝石:只返回线程中的最后一个孩子

时间:2011-07-01 10:33:50

标签: ruby-on-rails ruby ruby-on-rails-3

ancestry gem有很多方法可以导航树结构。你可以做Model.roots来显示所有根元素等。如何相反? - 为每个树结构返回最新的子项。

我想在我的模型中添加一个额外的列(latest / boolean),然后在保存过滤器等之后做一些逻辑。但是这感觉有点笨拙。 :/

祝你好运。 AsbjørnMorell

2 个答案:

答案 0 :(得分:0)

也许你可以和Class#inherited钩子一起破解,比如在创建新子类时更新父模型的属性:

http://www.ruby-doc.org/core/classes/Class.html#M000177

答案 1 :(得分:0)

老问题,仍然相关。 发现自己是一个解决方案(也有点笨拙),但我认为它运作得相当好。

使用如下方法扩展Array类:

class Array

  def ancestry_last_child
    last_child = self.map { |a| [a[:id], a[:ancestry], a[:updated_at]] }.sort_by { |id, anc, dat| [anc.split('/').length, dat] }.last
    self.find { |a| a[:id] == last_child[0] }
  end

end

之后只需使用它(使用前面的验证),如下所示:

account = Account.find([id])

if account.has_children?
  last_child = account.descendants.ancestry_last_child
end

如果您对扩展ruby / rails核心类有疑问this会有所帮助

:: EDIT :: 以前的解决方案没有完整的工作。此解决方案需要updated_atid