【问题标题】:Joining tables, counting, and group to return a Model连接表、计数和组以返回模型
【发布时间】:2012-01-26 19:17:42
【问题描述】:

所以我有一个 SQL 查询我想在 rails 中复制:

select g.* 
from gamebox_favorites f 
inner join gameboxes g on f.gamebox_id = g.id 
group by f.gamebox_id 
order by count(f.gamebox_id) desc;

我一直在阅读 rails Active Record Query Interface 网站,但似乎无法将这些内容放在一起。我希望查询返回 Gamebox 记录的集合,按游戏盒拥有的“收藏夹”数量排序。在 Rails 中最干净的方法是什么?

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    我相信这会奏效(在本地结构类似的数据库上工作),但我不确定我是否在合适的位置有合适的模型来满足你想要做的事情,所以你可能需要移动一个 coule周围的东西:

    Gamebox.joins(:gamebox_favorites).
      group('"gamebox_favorites"."gamebox_id"').
      order('count("gamebox_favorites"."gamebox_id")')
    

    在控制台上,这应该编译为(在后端使用 PostgreSQL 的情况下):

    SELECT "gameboxes".* FROM "gamebox_favorites" 
      INNER JOIN "gamebox_favorites" 
      ON "gamebox_favorites"."gamebox_id" = "gamebox"."id" 
      GROUP BY "gamebox_favorites"."gamebox_id" 
      ORDER BY count("gamebox_favorites"."gamebox_id")
    

    ...我猜您不想将其包装在 find_by_sql 调用中,例如:

    Gamebox.find_by_sql("select g.* from gamebox_favorites f 
      inner join gameboxes g 
      on f.gamebox_id = g.id 
      group by f.gamebox_id 
      order by count(f.gamebox_id) desc")
    

    【讨论】:

    • 一些数据库会立即抱怨您的 SELECT 中有未分组和未聚合的列。 (AFAIK)9.2 之前的 PostgreSQL 版本尤其会提出这种抱怨。 MySQL 和 SQLite 会让歧义消失。
    • 感谢 Normalocity - 我会试一试上面的内容。在 find_by_sql 调用中包装语句通常是不好的做法吗?我想它会使事情变得不那么独立于数据库。我不太确定部署时最终会使用什么数据库 - 最有可能是 MySQL。
    • @normalocity - 谢谢!以上工作完美。快速跟进:如果我只想选择当前日期一个月内创建的 GameFavorites,最佳做法是什么?尽管谷歌搜索了很长时间,但我似乎找不到在 SQLite 或 Rails 中执行此操作的 SQL 命令。任何建议将不胜感激。再次感谢!
    • @TheSciz - 我不会说将东西包装在find_by_sql 中是不好的做法。提供它的部分原因是在 Active Record Query 中编写复杂查询会降低其可读性的情况。确实,您对某些查询失去了一些数据库不可知论,但是如果您有涵盖相关查询的测试,那么如果/当您切换到另一个数据库时,这些测试将失败,因此您会立即知道(在部署之前)出事了。此外,老实说,您真正多久更换一次数据库?这并不是大多数人在实践中面临的问题。
    • @TheSciz - 你最终选择什么数据库来部署并不重要。如果是 MySQL,那么在你的机器上设置一个本地 MySQL 数据库进行开发,尽可能地反映你的生产环境,你不必担心 MySQL 查询和 SQLite 查询之间的差异,因为你'将在生产和开发中使用 MySQL。
    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 2013-05-16
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2020-01-18
    相关资源
    最近更新 更多