我在Rails 5中运行以下查询,目的是找到具有最多投球的用户:
User
.select("users.*, COUNT(user_id) as pitch_count")
.unscoped
.joins("LEFT JOIN pitches AS pitches ON pitches.user_id = users.id")
.group("pitch.user_id")
.order("pitch_count DESC")
.limit(5)但我发现了错误:
Caused by PG::UndefinedColumn: ERROR: column "pitch_count" does not exist为什么pitch_count不能对查询进行排序?
发布于 2019-09-07 07:39:43
问题在未限定范围方法中。它移除所有以前定义的作用域,包括select语句。请参见以下示例:
User.select(:full_name, :email).unscoped.to_sql
# => SELECT "users".* FROM "users"
User.unscoped.select(:full_name, :email).to_sql
# => SELECT "users"."full_name", "users"."email" FROM "users"看到区别了吗?在unscoped定义之后调用的select完全删除了select中定义的所有东西。
对于您来说,这意味着您应该修改代码以在模型名称之后调用unscoped:
User
.unscoped
.select("users.*, COUNT(user_id) as pitch_count")
.joins("LEFT JOIN pitches AS pitches ON pitches.user_id = users.id")
.group("pitch.user_id")
.order("pitch_count DESC")
.limit(5)注意:新增的行主要是为了可读性,但在您的ruby文件中应该是这样工作的。如果您想在rails控制台中执行它。你将不得不删除新的行
顺便说一句。仍然可能会出现错误,即列"user.id“必须出现在GROUP子句中,或者在聚合函数中使用。应该修改group语句以使用users.id而不是pitch.user_id来解决这个问题。
.group("users.id")发布于 2019-09-04 23:15:02
我建议您使用缓存使其易于维护,并提高性能。通过添加计数器缓存,您可以通过User.reorder(pitches_count: :desc).first获得具有大多数投球的用户记录。
https://stackoverflow.com/questions/57796426
复制相似问题