Sql Arel发生了什么事?我该如何处理Arel::SelectManager?

Sql Arel发生了什么事?我该如何处理Arel::SelectManager?,sql,ruby-on-rails-3,arel,Sql,Ruby On Rails 3,Arel,我拼命想弄明白阿雷尔的意思,主要是因为我讨厌处理SQL;我做得很好,但我遇到了麻烦 我一直在Rails 3.0.0中工作,我正在尝试使用一些数学知识进行一个复杂的查询。实际情况比较复杂,但我简化了一点。在我的示例中,我有一个带有特定字符串字段的表,我需要所有记录的计数,以及该字段的两个可能值中的每一个的计数,并按外部id分组 在Rails 3.0.0下,我可以这样做(控制台命令): 在这一点上,我可以做x.to_sql和。。。嗯,我不完全确定这是对的,但是结果看起来是对的,除了有两次foreig

我拼命想弄明白阿雷尔的意思,主要是因为我讨厌处理SQL;我做得很好,但我遇到了麻烦

我一直在Rails 3.0.0中工作,我正在尝试使用一些数学知识进行一个复杂的查询。实际情况比较复杂,但我简化了一点。在我的示例中,我有一个带有特定字符串字段的表,我需要所有记录的计数,以及该字段的两个可能值中的每一个的计数,并按外部id分组

在Rails 3.0.0下,我可以这样做(控制台命令):

在这一点上,我可以做x.to_sql和。。。嗯,我不完全确定这是对的,但是结果看起来是对的,除了有两次foreign_id列

SELECT     
  `some_thingies_external`.`foreign_id`, 
  `some_thingies_external`.`all_count`, 
  `some_thingies_external_2`.`foreign_id`, 
  `some_thingies_external_2`.`type1_count` 
FROM       
  (SELECT     
    `some_thingies`.`foreign_id`, COUNT(`some_thingies`.`foreign_id`) 
   AS `type1+count` 
   FROM       `some_thingies`  
   GROUP BY  `some_thingies`.`foreign_id`) `some_thingies_external`  
INNER JOIN 
  (SELECT     `some_thingies`.`foreign_id`, COUNT(`some_thingies`.`foreign_id`) 
   AS `type1_count` 
   FROM       `some_thingies`  
   WHERE     `some_thingies`.`type` = 'type1' 
   GROUP BY  `some_thingies`.`foreign_id`) `some_thingies_external_2` 
ON `some_thingies_external`.`foreign_id` = `some_thingies_external_2`.`foreign_id`
到目前为止还不错。但是,当我尝试加入第二组计数时,如下所示:

i = t.where(t[:some_field].eq('type2')).project(t[:foreign_id], t[:foreign_id].count.as('type2_count')).group(t[:foreign_id])
x = x.join(i).on(e[:foreign_id].eq(i[:foreign_id]))
它只是挂断了,让我觉得我在打

(顺便说一句,我有更多的计数要加进去,理想情况下,“some_thingies”本身应该是一个arel对象,表示我们正在计算的东西的更多过滤…但我偏离了主题…)

因此,我决定试用最新的edge Arel和Rails,并相应地增加了我的宝石:

gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'rack', :git => 'git://github.com/rack/rack.git'
gem 'arel', :git => 'http://github.com/brynary/arel.git'
现在,当我尝试先执行连接时,它失败得很惨:

ruby-1.9.2-preview3 >     x = x.join(c).on(e[:foreign_id].eq(c[:foreign_id])) 
NoMethodError: undefined method `[]' for #<Arel::SelectManager:0x00000104311e38>
    from (irb):12
    from /Users/stephan/.rvm/gems/ruby-1.9.2-preview3/bundler/gems/rails-c42ea2172eb9/railties/lib/rails/commands/console.rb:44:in `start'
    from /Users/stephan/.rvm/gems/ruby-1.9.2-preview3/bundler/gems/rails-c42ea2172eb9/railties/lib/rails/commands/console.rb:8:in `start'
    from /Users/stephan/.rvm/gems/ruby-1.9.2-preview3/bundler/gems/rails-c42ea2172eb9/railties/lib/rails/commands.rb:33:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
ruby-1.9.2-preview3>x=x.join(c).on(e[:foreign\u id].eq(c[:foreign\u id]))
NoMethodError:的未定义方法“[]”#
来自(irb):12
来自/Users/stephan/.rvm/gems/ruby-1.9.2-preview3/bundler/gems/rails-c42ea2172eb9/railties/lib/rails/commands/console.rb:44:在“开始”中
来自/Users/stephan/.rvm/gems/ruby-1.9.2-preview3/bundler/gems/rails-c42ea2172eb9/railties/lib/rails/commands/console.rb:8:in'start'
来自/Users/stephan/.rvm/gems/ruby-1.9.2-preview3/bundler/gems/rails-c42ea2172eb9/railties/lib/rails/commands.rb:33:in`'
来自脚本/rails:6:in'require'
来自脚本/rails:6:in`'
这看起来不像是Arel中的一个bug——如果有什么的话,它更像是以前工作过的bug。我想我只是不知道什么是Arel::SelectManager以及如何使用它。看起来我做得很好,但我真的不明白发生了什么

我是否需要根据我的SelectManager创建一个新表?或者我在配置中出错,导致[]语法失败?还是我完全不明白阿雷尔是做什么的?我仍然不太明白我应该如何处理Arel::Rows,但我想我会掌握其中的诀窍;我怀疑我可以通过一个项目()除去结果中多余的外键

但我还是迷路了。哈阿尔普


p、 “railties”是与“frailties”押韵,还是与“mail-guys”押韵?

我将回答我自己的问题,因为似乎没有人感兴趣,现在我知道我做错了什么,我可以看出,如果我理解SQL,这将是显而易见的

我使用Arel的方式的问题1是,你只能加入一张新制作的桌子。那不是重点

真正的问题是我在数两种不同的东西。我真的应该按外来ID和“some_字段”进行分组。我只是不知道你能做到,结果有点奇怪。如果我不关心某个_字段的所有可能值,这可能会很烦人,但我确实关心所有这些值,我可以很容易地将它们相加得到总数,现在很容易过滤掉它们

t = Arel::Table.new(:some_thingies)    
e = t.group(:foreign_id, :some_field).project(t[:id], t[:foreign_id], t[:some_field])
一旦我明白了这一点,我就明白了如何使用普通的ActiveRecord而不使用ARel:

SomeThing.group('foreign_id, some_field').select('id, foreign_id, some_field, count(1)')

哦!寓意:SQL只知道行。这段时间。

阿雷尔已经完全从头做起了。这项计划是由tenderlove(Aaron)发起的,在大部分组合查询上存在性能问题

我自己甚至为这项新倡议作出了贡献

Arel现在使用抽象语法树(在selectmanager中)和访问者模式


您不妨放弃Arel 1.0.1在flavor for 2.0.0中的工作方式(在通往3.0.x以与rails保持一致的道路上)

我也得到了一个SelectManager,我不知道该怎么处理它。你的回答并不能回答这个问题。不管怎样,如果你认为你给自己的答案是正确的答案,你应该马克是“正确答案”。是的,我没有一个正确的答案。我想我真正想问的是“有人能告诉我如何用一种实用的方式使用Arel吗?”我已经放弃了,我用Squeel Hm获得了很好的效果。。。只是我的意见:我想你没有太努力。我从未在arel中使用过group子句,但我越来越高兴地使用它;角色=Role.arel_表;User.joins(:roles).where(roles[:name].eq(“admin”).和(User[id].gt(50));注释=Comment.arel_表;Post.joins(:comments).order(comments[:id].count)
SomeThing.group('foreign_id, some_field').select('id, foreign_id, some_field, count(1)')