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