我的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
虽然我会建议,如果你将有一个非常复杂的SQL语句,为什么不使用execute语句,然后将其绑定到类函数?反正是一样的吧?只是一个想法 – corroded 2011-03-31 17:40:28
你会是正确的,它会工作得很好(也许更好,因为ActiveRecord的抽象层不会在那里阻碍),问题是复杂的SQL语句远不及我的能力。这就是为什么我希望Rails-y能支撑我的手。我会深入了解一下,看看我能不能理清一条直接的SQL语句,它会让我在需要的地方同时访问。 – John 2011-03-31 17:46:28
也许你可以在这里要求特别声明吗?我自己并不是SQL大师,我实际上认为像这样复杂的语句可以很容易地变成一个真正的sql语句。无论如何,这是我的老板通常做的(他也是一个编码器),我相信这是一种更有效的方式(因为连接往往会减慢速度,所以使用轨道包装器) – corroded 2011-03-31 18:23:24