需要一系列自我,儿童和儿童儿童的铁轨

时间:2012-11-27 08:29:50

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

我有一个如下表

Mysql table with parent ids

好吧,在这个表中每个用户都有一个父用户,然后如果我们选择一个用户,那么它的id,子id和子孩子id应该作为数组返回。我需要一个查询来获取这些值在rails中而不使用任何gem.Thanx为您提供帮助: - >

2 个答案:

答案 0 :(得分:1)

你正在陷入SQL反模式。在像这样构造的树上执行操作是非常低效的。我没有说,你应该使用gem,但考虑使用一些更聪明的方法来保存这些数据(搜索sql tree structure应该产生一些有意义的结果)。

查询您正在寻找需要两个自联接:

SELECT t1.id user_ids, t2.id children_ids, t3.id children_children_ids FROM users t1 
  LEFT JOIN users t2 ON t2.parent = t1.id
  LEFT JOIN users t3 ON t3.parent = t2.id

另一方面,如果您的rails模型已经定义了自我关系,您可以轻松地写下:

user.children #=> (array of children)
user.children.flat_map(&:children) #=> (array of grandchildren)

此关系的定义应如下所示:

class User << ActiveRecord::Base
  has_many :children, class_name: User, foreign_key: 'parent'
end

答案 1 :(得分:1)

class User << ActiveRecord::Base      
  def self.build_tree(reverse=false)
    g = Array.new    
    self.find(:all).each do |p|           
        if reverse
        g << [p.id,p.parent]            
        else
        g << [p.parent,p.id]            
        end
    end
    g
  end
  def self.subordinates(man_id)
    g = self.build_tree false       
    g.map{|i| i[1] if i[0]==man_id.to_i}.compact    
  end
  def self.superiors(user_id)
     g = self.build_tree true            
     g.map{|i| i[1] if i[0]==user_id.to_i}.compact     
  end
end

当致电上司(父母)下属(子女)时,会提供所需的结果
例如: - [2,4,6,8]
如果您想获得孩子 - >儿童抗体父母 - >父母,只需执行迭代调用函数上级或下级,直到获得 nil或[] 数组。