Rails 3提高了Active Record查询性能

时间:2012-06-15 23:05:05

标签: ruby-on-rails-3 performance

您好我有以下问题:

Player.select("Players.*, (SELECT COUNT(*) FROM Results WHERE Results.player_id = Players.id and win = true and competition_id = 4) as wins").where("competition_id = 4").order("wins desc")

基本上,它根据结果表中的外键事件来计算和排序玩家记录,其中win对于特定比赛设置为true。为了让您更好地了解结果表中的一些示例数据可能是......

Player_ID | Match_ID|Win|Elapsed_Time|etc..
1         |    1    |T  | 1:00       |etc..
2         |    1    |F  | 1:00       |etc..
1         |    2    |T  | 3:00       |etc..
3         |    2    |F  | 3:00       |etc..

正如你可以看到在这个声明中发生了两个选择,我认为这可能会在将来导致性能下降。玩家实际上与结果有一对多的关系,你可以猜到但我无法弄清楚如何使用我认为可能更有效的联接来完成这项工作。

也许我错了,上面的查询没有任何问题 - 无论哪种情况,请提供一些建议。

我正在使用PostgreSQL数据库。

1 个答案:

答案 0 :(得分:0)

也许是这样的?

Player.joins(:results).where("results.win = true AND results.competition_id = 4").order("results.count DESC")