2011-03-29 78 views
1

我的SQL技能充其量是可笑的,这就是为什么Rails和ActiveRecord让我的生活变得更轻松。然而,这一次,它可能代表了一种拐杖,它让我无法了解后端发生了什么,以便知道给named_scope提供什么。named_scope相关表中列的总和

我试图返回代表游戏中评分最高的“演员”的表的前10条记录。得分是通过演员>行为计算> Decsisons.point_value

我可以得到任何个体演员很轻松地得分,但连接和金额都高于我的SQL的了解,以它的范围为前10名出了整个的D b。

这里是Actor模型,因为我有它目前:

class Actor < ActiveRecord::Base 
    has_many :acts, :dependent => :destroy 
    has_many :decisions, :through => :acts, :order => 'created_at' 

    named_scope :high_scores, { 
    :conditions => {:finished => true}, 
    :joins => "INNER JOIN acts ON actor.id = acts.actor_id INNER JOIN decisions on decision.id = decision.act_id", 
    :group => 'actor.id', 
    :select =>'actors.*, SUM(acts.decisions.point_value) AS score', 
    :order => "score DESC", 
    :limit => 10 
    } 

end 

基于这里的一些帖子和其他一些网站尝试了几件事情之后,我显然不是抓什么事情或者什么named_scope需要连接点。一些清晰度将不胜感激。谢谢。

*编辑:更新named_scope什么,我现在有

现在,这使我有以下错误:

Mysql::Error: Unknown column 'acts.decisions.point_value' in 'field list': SELECT actors.*, SUM(acts.decisions.point_value) AS score FROM actors INNER JOIN acts ON actor.id = acts.actor_id INNER JOIN decisions on decision.id = decision.act_id WHERE (actors . finished = 1) GROUP BY actor.id ORDER BY score DESC LIMIT 10

+0

虽然我会建议,如果你将有一个非常复杂的SQL语句,为什么不使用execute语句,然后将其绑定到类函数?反正是一样的吧?只是一个想法 – corroded 2011-03-31 17:40:28

+0

你会是正确的,它会工作得很好(也许更好,因为ActiveRecord的抽象层不会在那里阻碍),问题是复杂的SQL语句远不及我的能力。这就是为什么我希望Rails-y能支撑我的手。我会深入了解一下,看看我能不能理清一条直接的SQL语句,它会让我在需要的地方同时访问。 – John 2011-03-31 17:46:28

+0

也许你可以在这里要求特别声明吗?我自己并不是SQL大师,我实际上认为像这样复杂的语句可以很容易地变成一个真正的sql语句。无论如何,这是我的老板通常做的(他也是一个编码器),我相信这是一种更有效的方式(因为连接往往会减慢速度,所以使用轨道包装器) – corroded 2011-03-31 18:23:24

回答

0

设定的最终成绩表列,而不是,因为它似乎是资源较少。