gpt4 book ai didi

activerecord - 使用 Arel 进行嵌套集和连接查询并转换为 ActiveRecord::Relation

转载 作者:行者123 更新时间:2023-12-04 01:55:22 25 4
gpt4 key购买 nike

我有一个组织模型(嵌套集)。我有一个人的模型。一个人可以有另一个人作为副手。一个组织归一个人所有。组织仅对所有者或其代表可见。

我想检索给定人员可见的所有组织,即。由该人拥有或由其他人拥有的所有组织,该人是其代表:

o = Arel::Table.new(:organisations)
p = Arel::Table.new(:people)
pd = p.where(p[:id].eq(3).or(p[:deputy_id].eq(3))).project(:id)
op = o.join(p).where(o[:person_id].in(pd)).project("distinct organisations.*)

可能有更好的方法来制定最后一次加入,但我想将人员及其代表的查询与人员及其代表可见的组织的查询分开。

最后一个连接返回一个 Arel::SelectManager(似乎没有任何有用的文档)。

有没有办法将 SelectManager 转换回 ActiveRecord::Relation 以从“组合下的闭包”的整个概念中受益?

我如何再次加入上述关于组织的查询,以获取一个人或其代理人可见的组织的所有后代?我知道 SQL,但总是无法使用 SelectManager 对组织进行自联接。

最佳答案

似乎没有人接受任何答案,我自己找到了解决方案:

1. 将最后一个连接转换为 ActiveRecord::Relation

Organisation.where(o[:id].in(op))

唯一的问题是这会调用 Arel::SelectManager.to_a它带有弃用警告(也是一项昂贵的操作)。我还没有找到替代方案(怀疑没有替代方案,这个弃用警告只是 Arel 中可观察到的不一致之处之一,它在 ActiveRecord 中被采用)。

2. 嵌套集合上的自连接以获取所有后代
o = Organisation.scoped.table
op = Organisation.where(o[:person_id].in(Person.self_and_deputies(person_id).project(:id))).arel
o1 = Arel::Table.new(:organisations, :as => "o1")
o2 = Arel::Table.new(:organisations, :as => "o2")
o3 = o1.join(o2).on(
o1[:lft].gteq(o2[:lft]).and(
o1[:rgt].lteq(o2[:rgt]))).where(
o2[:id].in(op)).project("distinct o1.id")
Organisation.where(o[:id].in(o3))

关于activerecord - 使用 Arel 进行嵌套集和连接查询并转换为 ActiveRecord::Relation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4500629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com