TypeError:无法访问Arel :: Nodes :: Union

时间:2011-07-05 22:01:42

标签: ruby arel

我在表的两个子集上执行联合,其中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中可行吗?)...

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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