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

从表面上看,它看起来就像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]))

但是我不能让它在使用活动记录的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]))

关于如何做的任何想法?

解决方法

首先用项目替换select.在关系代数中,SELECT(限制)是WHERE子句.

其次,您可以进行子选择.

sub_restriction = b.
                   where( b[:domain].eq(1) ).
                   project( b[:domain] )

restriction = a.
               where( a[:domain].in sub_restriction )

完成“子选择”!

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...