在活动记录中使用arel的关系计数

Jer*_*ith 8 ruby activerecord ruby-on-rails arel

我有一个非常艰难的时间来确定如何执行此查询以及其他类似于活动记录中的arel.

  select users.id, 
         users.name, 
         maps.count as map_count, 
  from users
  left join (select user_id, count(map_id) as count from maps_users group by user_id) maps on users.id = maps.user_id
Run Code Online (Sandbox Code Playgroud)

从表面上看,它看起来就像Nik的例子(http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/):

photo_counts = photos.
group(photos[:user_id]).
project(photos[:user_id], photos[:id].count)

users.join(photo_counts).on(users[:id].eq(photo_counts[:user_id]))
Run Code Online (Sandbox Code Playgroud)

但我不能让它在使用活动记录的rails中工作.我认为等效应该是这样的,但它出错了:(

  maps = Map.arel_table
  map_counts = Map.group(maps[:owner_id]).
                   select(maps[:owner_id]).
                   select(maps[:id].count.as("map_count"))
  users = User.joins(map_counts).on(User.arel_table[:id].eq(map_counts[:map_count]))
Run Code Online (Sandbox Code Playgroud)

关于如何做的任何想法?

nes*_*sur -2

是的,那篇文章确实让我也想学习阿雷尔魔法。

Stackoverflow 上的所有“使用 Arel 做一些智能的事情”问题都可以通过 SQL 得到解答。从文章和研究来看,我可以说 Arel 不是 ActiveRecord。尽管查询是动态表述的,但 Active 没有能力映射完全形成的 Arel 投影的结果。

您可以使用以下方式指定运算符

https://github.com/activerecord-hackery/squeel
Run Code Online (Sandbox Code Playgroud)

但没有子选择。

更新:天哪,我五年前回答过这个问题。不开玩笑,链接已失效:)