0

我有一张如下表

带有父ID的Mysql表

好吧,在这个表中,每个用户都有一个父用户,那么如果我们选择一个用户,那么它的 id ,children ids 和children ids 应该作为数组返回。我需要一个查询来在不使用任何 gem 的情况下在 rails 中获取这个值。感谢您的帮助:->

4

2 回答 2

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 或 []数组。

于 2012-11-27T11:59:43.743 回答
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
于 2012-11-27T08:36:43.697 回答