8

我很难从活动记录中弄清楚如何在 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]))

关于如何做的任何想法?

4

2 回答 2

1

那么首先用项目替换选择。在关系代数中,SELECT(限制)是 WHERE 子句。

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

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

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

“子选择”完成!:-)

于 2011-06-15T15:05:35.170 回答
-2

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

Stackoverflow 上的所有“用 Arel 做一些智能的事情”的问题都可以用 SQL 来回答。那么,从文章和研究来看,我可以说 Arel 不是 ActiveRecord。尽管查询的动态公式化,Active 没有能力映射完全形成的 Arel 投影的结果。

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

https://github.com/activerecord-hackery/squeel

但没有子选择。

更新:天哪,我在 5 年前回答了这个问题。没有开玩笑的链接已经死了:)

于 2011-03-18T14:26:11.153 回答