很棒的嵌套集包括一个祖先实例方法: https ://github.com/collectiveidea/awesome_nested_set/wiki/Awesome-nested-set-cheat-sheet
@john = Group.where(name: "John").first
@tree = @john.ancestors
我正在寻找一种类方法,该方法将为每个名为“John”的组返回祖先的数组或 AR 关系
@johns = Group.where(name: "John")
@tree = @johns.ancestors
目前,我通过循环一个 AR 关系并为每一行运行实例方法来做到这一点。
更新1
class Group < ApplicationRecord
acts_as_nested_set :counter_cache => :children_count
def self.build_tree(groups)
groups.collect(&:ancestors).flatten!
end
end
class GroupsController < ApplicationController
def index
@johns = Group.where(name: "John")
@tree = Group.build_tree(@johns)
end
end
错误:
undefined method `collect' for #<Class:0x00000002a28378>
更新2
Ancestor => Group 关系似乎存在问题。
class Group < ApplicationRecord
acts_as_nested_set :counter_cache => :children_count
has_many :ancestors
def self.build_tree(objects)
objects.collect(&:ancestors).flatten!
end
End
class Ancestor < ActiveRecord::Base
belongs_to :group
scope :with_group, -> (name) { joins(:group).where("groups.name = ?", name) }
end
2.4.0 :008 > Ancestor.joins(:group)
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "ancestors" does not exist
LINE 1: SELECT "ancestors".* FROM "ancestors" INNER JOIN "groups" O...
^
: SELECT "ancestors".* FROM "ancestors" INNER JOIN "groups" ON "groups"."id" = "ancestors"."group_id" LIMIT $1
2.4.0 :009 > Ancestor.includes(:group)
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "ancestors" does not exist
LINE 1: SELECT "ancestors".* FROM "ancestors" LIMIT $1
^
: SELECT "ancestors".* FROM "ancestors" LIMIT $1