令人敬畏的nestset设置祖先类方法

时间:2017-05-17 04:07:40

标签: ruby-on-rails nested-sets awesome-nested-set

令人敬畏的嵌套集包含一个祖先实例方法: 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

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