【问题标题】:named_scope for sum of column in related tablenamed_scope 用于相关表中列的总和
【发布时间】:2011-03-29 14:43:45
【问题描述】:

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

我试图返回代表游戏中得分最高的“演员”的表的前 10 条记录。分数是通过 Actor>Acts>Decisisons.point_value

计算的

我可以很容易地获得任何单个参与者的分数,但是连接和总和超出了我对 SQL 的理解,以便将其范围限定为整个数据库中的前 10 名。

这是我目前拥有的 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 actor.*, SUM(acts.decisions.point_value) AS score FROM actors INNER JOIN 作用于 actor.id = act.actor_id INNER JOIN 决策 on decision.id = decision.act_id WHERE (actors.finished = 1) GROUP BY actor.id ORDER BY score DESC LIMIT 10

【问题讨论】:

  • 我会建议,如果你将有一个非常复杂的 sql 语句,为什么不直接使用 execute 语句然后将它绑定到一个类函数呢?反正都是一样的,对吧?只是一个想法
  • 你是对的,因为它同样可以很好地工作(而且可能更好,因为 ActiveRecord 的抽象层不会妨碍它),复杂的 SQL 语句的问题远不及我的能力。这就是为什么我希望会有一些 Rails-y 可以握住我的手。我会深入研究,看看我是否能整理出一条直截了当的 SQL 语句,让我在此期间到达我需要的地方。
  • 也许您可以在 SO 中要求该特定声明?我自己不是 SQL 专家,我实际上认为像这样的复杂语句可以很容易地变成真正的 sql 语句。无论如何,这就是我的老板通常会做的事情(他也是一名编码员),我相信这是一种更有效的方式(因为连接往往会减慢速度……使用 rails wrapper 时会加倍)
  • 我认为我实际上要做的只是将最终分数放在一个列中,因为它们在游戏结束后不会改变,如果它们改变了,那也没关系。这将使查找成为一个简单的按分数和限制 10 排序的问题,而不是跨连接计算事物并基于整个数据库同时求和。我尝试在 Sequel Pro 中运行类似的 SQL 语句,但它需要很长时间,而且 SUM 运算符甚至都没有发挥作用。谢谢!

标签: ruby-on-rails activerecord sum has-many named-scope


【解决方案1】:

改为在表格列中设置最终分数,因为它似乎不太占用资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    相关资源
    最近更新 更多