我的控制器中有按最高平均 comments 评级对相册进行排名的代码(使用此解决方案中的代码How to display highest rated albums through a has_many reviews relationship):

@albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group("albums.id").order("average_rating DESC")

这段代码在我的开发环境(sqlite3)中运行良好,但是当我将代码推送到heroku和postgresql时,我得到了以下错误:

PG::GroupingError: ERROR:  column "reviews.id" must appear in the GROUP BY clause or be used in an aggregate function

我意识到这是一个相当常见的问题,我对SQL有点缺乏经验,所以我很难重构代码,使其在我的开发和生产环境中都能工作.

推荐答案

如果不将reviews.id添加到GROUP BY子句或应用avg()之类的聚合函数,则不允许 Select reviews.id(通过通配符*隐式 Select ).解决方案是执行以下操作之一:

  1. 从 Select 列表中删除通配符*
  2. 将字段reviews.id添加到组子句中
  3. 显式 Select reviews.id并对其应用聚合函数(例如sum(reviews.id))
  4. 将通配符*替换为特定于表的通配符albums.*

不过,第二个和第三个选项在您的场景中没有多大意义.

Ruby-on-rails相关问答推荐

如何测试自定义路由?

在has_many关系中由两个条件 Select

在ransackable_scopes中的作用域上创建activeadmin过滤器

对Rails进行枚举不允许空值

ActiveRecord::声明在类别中无效#new

删除链接不起作用,重定向 echo 示 Ruby

Rspec期望()与期望{}

为特定操作使用布局

PostgreSQL 无间隙序列

在 Rails 的 ActiveRecord 中,touch 有什么用?

如何在 rails 中指定和验证枚举?

搭建脚手架时建立关系

如何在 rspec 中运行单个测试?

Rails - 生产模式下的错误

适合mysql比较的Ruby datetime

Rails 引擎中的迁移?

格式化日期对象以显示人类可读的日期

我可以在 Ubuntu 上使用 apt-get 安装 gems 吗?

如何在 Rails 3 中将多个属性传递给 find_or_create_by?

Ruby on Rails:如何为 postgresql 编辑 database.yml?