类型错误:无法访问 Arel::Nodes::Union

发布于 2024-11-18 18:05:13 字数 669 浏览 3 评论 0 原文

我正在对我的 domain 表的两个子集执行联合,其中 cnt 是局部变量,使用 arel 2.0.9 和 squeel 0.8.5 作为查询接口。

def bla cnt
    Domain.group { some_id }.select { `*` }.select { count(`*`).as(`cnt`) }.having { `cnt` >= cnt }
end

现在,当构建两个调用的联合时,例如 cnt(1).union(cnt(1)) 我得到一个 Arel::Nodes::Union 实例。

我如何利用这种关系来实际获得结果?调用 #each 会产生完全相同的 Arel::Nodes::Union 引用,并且 #to_sql 会导致 TypeError: Cannot access Arel ::节点::联合

有什么想法吗?我可以以不同的方式编写查询,例如使用条件逻辑(在arel中可行吗?)...

I am performing a union over two subsets of my domain table with cnt being a local variable, using arel 2.0.9 and squeel 0.8.5 as query interface.

def bla cnt
    Domain.group { some_id }.select { `*` }.select { count(`*`).as(`cnt`) }.having { `cnt` >= cnt }
end

Now when building the union of two calls say cnt(1).union(cnt(1)) I get a Arel::Nodes::Union instance.

How do I use this relation to actually get my results? Calling #each yields the very same Arel::Nodes::Union reference and #to_sql results in an TypeError: Cannot visit Arel::Nodes::Union.

Any ideas? I could write the query differently, e.g. by using conditional logic (doable in arel?) ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寄人书 2024-11-25 18:05:13

不确定我是否理解正确,但要获得两个或多个单独查询的联合,您可以使用以下方法:

scope :union, lambda { |a, b| where{id.in(Model.where{attr1.eq a}) | id.in(Model.where{attr2.eq b}) } }

它有点难看,但我不知道有任何其他方法......

Not sure if I am understanding you right, but to get a union of two or more separate queries, you can use the followng approach:

scope :union, lambda { |a, b| where{id.in(Model.where{attr1.eq a}) | id.in(Model.where{attr2.eq b}) } }

It's a little ugly, but I am not aware of any other approach...

和我恋爱吧 2024-11-25 18:05:13

您需要将 ActiveRecord::Relation 对象转换为 Arel::Nodes::SelectStatement,您可以通过 Relation#ast 轻松完成此操作代码>:

union = Arel::Nodes::Union.new( cnt(1).ast, cnt(1).ast )
Domain.find_by_sql( union.to_sql )

You need to convert the ActiveRecord::Relation object into a Arel::Nodes::SelectStatement, you can easily do this by way of Relation#ast:

union = Arel::Nodes::Union.new( cnt(1).ast, cnt(1).ast )
Domain.find_by_sql( union.to_sql )
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文