我花了很多时间从事件记录中找出如何执行此查询以及其他类似操作。
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 )
“子选择”已完成! :-)
关于ruby-on-rails - 在事件记录中使用Arel的关系计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5178799/