使用 Railsancestry
gem , 在用户模型上编写范围以查找所有具有子项/哪些是父项的记录的最佳方法是什么?
class User < ActiveRecords::Base
has_ancestry
def is_manager?
has_children
end
scope :is_manager, -> { ... ? ... }
end
试试这个,我认为这是最好的方法
scope :is_manager, -> {where(id: User.pluck(:ancestry).compact.map { |e| e.split('/') }.flatten.uniq)}
它仅从数据库中选择祖先字段,删除 nil,拆分它并获取数字,扁平化它,使其成为 Uniq,然后基于它选择所有用户。
还要检查这个问题
与融冰的答案相同。
这样做也是如此,但它不是将所有记录从数据库加载到内存中,而是只选择唯一的祖先并处理它们 - 这应该在内存影响方面有所作为
scope :is_manager, -> { where(id: User.select(:ancestry).distinct.pluck(:ancestry).compact.map { |x| x.split('/') }.flatten.uniq) }