【问题标题】:Is there a way to convert this to rails arel queries? Or a better way to do this query?有没有办法将其转换为 rails arel 查询?或者更好的方法来做这个查询?
【发布时间】:2012-01-20 03:01:29
【问题描述】:

我有 3 个表:组、用户和帖子。帖子有一个 user_id,用户有一个 group_id。我想找出哪个组在某个日期范围内拥有最高海报,最好只使用 ActiveRecord。我认为这个查询可以完成这项工作:

select g_id, count(p_id) as posts_count 
from (
  select users.group_id as g_id, posts.id as p_id 
  from users inner join posts 
  on users.id = posts.user_id 
  where users.group_id is not null
  and posts.created_at > :since
  and posts.created_at <= :until
) as foo 
group by g_id 
order by posts_count desc limit 1;

谁能帮我把它翻译成红宝石?

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    只需几个步骤即可完成。 首先 - 获取按 group_id 分组的帖子数。

    posts = Post.includes(
            :user
        ).where(
            'users.group_id is not null'
        ).where(
            :posts => {:created_at => ('12.09.2011'.to_date)..('12.09.2012'.to_date)}
        ).group(
            :group_id
        ).count
    

    它会返回一个类似{1=&gt;4, 2=&gt;5, 3=&gt;2}的哈希,其中key是组的id,value是帖子的数量。

    然后你需要对这个哈希进行排序,并得到数组的最后一个元素。

    sorted_hash = posts.sort_by {|key,value| value}
    top_posters_group = sorted_hash[-1]
    

    之后,top_posters_group[0] 将是组的 id,top_posters_group[1] 是帖子的计数。

    但无论如何这不是理想的解决方案。

    使用 ruby​​ 1.9.2 在 rails 3.1 中测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多