ancestry gem有很多方法来导航树结构。你可以做Model.roots来显示所有的根元素,等等。反之亦然?-为每个树结构返回最新的子元素。
我想过在我的模型中添加一个额外的列(最新/布尔值),然后对after、save、filter等做一些逻辑处理,但是这感觉有点笨拙。:/
诚挚的问候。Asbjørn Morell
发布于 2011-07-01 21:27:15
也许你可以使用Class#inherited钩子来实现一些功能,比如在创建新的子类时更新父模型的属性:
http://www.ruby-doc.org/core/classes/Class.html#M000177
发布于 2015-06-12 19:37:12
老问题,仍然是相关的。我给自己找到了一个解决方案(也有点笨拙),但我认为它运行得相当好。
使用如下所示的方法扩展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_at和id列
https://stackoverflow.com/questions/6546815
复制相似问题