2012-06-20 48 views
1

我想做一些相当复杂的记录排序,我有一点麻烦。我有三个型号:轨道3订单记录由大孩子计数

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 

现在比赛结果页面我通过他们的总胜列出所有用户(WINS是通过成绩表计算)。第一件事,第一,我觉得谁进入了比赛与查询所有用户:

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发生。不知道如何在内部选择之前让它访问所有的用户标识,但当User.with_tournament_entires后跟查询时,这不是问题。

+0

它的顺序是什么?它在psql命令行上工作吗? –

+0

我甚至不知道从哪里开始编写这个ActiveRecord查询作为psql可读的原始sql。我尝试使用to_sql方法,但像往常一样产生垃圾SQL。我假设结果将是相同的,除非你提出有一些轨道魔法。就订单而言,可以说'ORDER BY total_wins DESC'完全没有。我可以将'DESC'更改为'ASC'并获得完全相同的结果。用我在旁边的查询,你是否知道一种方法来通过**总胜数**来计算用户记录,我计算了孙子记录? – Noz

+0

你已经有了原始的sql;执行'SELECT *,(SELECT count(*)FROM results ...'并看看会发生什么 –

回答

2

在你的SQL中,"users.id"被引用错误 - 它告诉Postgres寻找一个名字为“users.id”的列。

它应该是"users"."id",或者只是users.id(如果您的表/列名称与postgres关键字冲突,或者有标点符号或其他异常,只需引用它即可)。