【问题标题】:TypeError: Cannot visit Arel::Nodes::Union类型错误:无法访问 Arel::Nodes::Union
【发布时间】:2011-07-05 22:01:41
【问题描述】:

我正在对我的 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 visit Arel::Nodes::Union

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

【问题讨论】:

标签: ruby arel


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您需要将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 )
    

    【讨论】:

    • Arel::Nodes::Union 上没有 to_sql 实例方法(从 Rails 3.2.1 开始)。
    • @Dmytrii 不,但它确实存在于超类 Arel::Nodes::Node 中。我已经验证这在 3.2.2 中仍然有效
    • 我在尝试调用它时收到“未找到方法”。你确定这对你有用吗?
    • @Dmytrii 是的,我创建了一个 Rails 3.2 测试应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多