令人敬畏的嵌套集包含一个祖先实例方法: 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关系并为每一行运行实例方法来实现这一目的。
UPDATE1
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>
UPDATE2
Ancestor似乎存在问题=&gt;集团关系。
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
答案 0 :(得分:1)
你快到了,试试
@johns = People.where(name: "John")
@tree = @johns.collect(&:ancestors).flatten!
或者您可以使用联接查询
Ancestor.joins(:people).where("peoples.name = ?", 'John')
根据你的代码库你可以传递记录,但这不是一个好方法。
class People < ActiveRecord::Base
acts_as_nested_set :counter_cache => :children_count
def self.build_tree(peoples)
peoples.collect(&:ancestors).flatten!
end
end
class PeopleController < ApplicationController
def index
@johns = People.where(name: "John")
@tree = People.build_tree(@johns)
end
end
scope
示例,好的
class People < ActiveRecord::Base
has_many :ancestors
#your codes goes here
end
class Ancestor < ActiveRecord::Base
belongs_to :people
scope :with_people, -> (name) { joins(:people).where("peoples.name = ?", name) }
end
class PeopleController < ApplicationController
def index
@tree = Ancestor.with_people("John")
end
end