我正在尝试做一些相当复杂的记录排序,但我遇到了一些麻烦。我有三个模型:
class User < ActiveRecord::Base
has_many :registers
has_many :results, :through => :registers
#Find all the Users that exist as registrants for a tournament
scope :with_tournament_entrees, :include => :registers, :conditions => "registers.id IS NOT NULL"
end
注册
class Register < ActiveRecord::Base
belongs_to :user
has_many :results
end
结果
class Result < ActiveRecord::Base
belongs_to :register
end
现在,在锦标赛结果页面上,我按总胜利数列出所有用户(胜利通过结果表计算)。首先,我找到所有通过查询进入锦标赛的用户:
User.with_tournament_entrees
有了这个,我可以简单地循环返回的用户,并使用以下内容查询每个单独的记录,以检索每个用户的"总胜利":
user.results.where("win = true").count()
但是,我也想更进一步,按"总胜利"对所有用户进行排序,这是我能想到的最好的:
User.with_tournament_entrees.select('SELECT *,
(SELECT count(*)
FROM results
INNER JOIN "registers"
ON "results"."register_id" = "registers"."id"
WHERE "registers"."user_id" = "users.id"
AND (win = true)
) AS total_wins
FROM users ORDER BY total_wins DESC')
我认为它很接近,但它实际上并没有按照我的指示按total_wins降序排序。我正在使用PostgreSQL数据库。
编辑:
实际上有三个选择发生,第一个发生在User.with_tournament_entries
上,它只对用户表执行快速筛选。如果我忽略它并尝试
SELECT *, (SELECT count(*) FROM results INNER JOIN "registers" ON "results"."register_id" = "registers"."id" WHERE "registers"."user_id" = "users.id" AND (win = true)) AS total_wins FROM users ORDER BY total_wins DESC;
它在 PSQL 和 ERB 控制台中都失败。我收到错误消息:
PGError: ERROR: column "users.id" does not exist
我认为发生这种情况是因为内部选择发生在外部选择之前,因此它事先无法访问用户 ID。不确定如何在内部选择发生之前授予它对所有用户 ID 的访问权限,但当我在查询之后User.with_tournament_entires
这样做时,这不是问题。
在你的SQL中,"users.id"
被错误地引用了——它告诉Postgres寻找一个字面意思是"users.id"的列。
它应该是"users"."id"
,或者,只是users.id
(只有当你的表/列名称与postgres关键字冲突,或者有标点符号或其他不寻常的东西时,你才需要引用它)。