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