当前位置: 首页 > 面试题库 >

Find_by_sql作为Rails范围

申自明
2023-03-14
问题内容

Sitepoint的r937足以帮助我确定需要从数据库返回正确结果的查询。

我需要的是能够将此查询用作作用域,并能够将其他作用域链接到该作用域。

查询是:

SELECT coasters.*
FROM (
    SELECT order_ridden,
           MAX(version) AS max_version
    FROM coasters
    GROUP BY order_ridden
) AS m
INNER JOIN coasters
ON coasters.order_ridden = m.order_ridden
AND COALESCE(coasters.version,0) = COALESCE(m.max_version,0)

我试图使像这样的范围:

  scope :uniques, lambda {
    find_by_sql('SELECT coasters.*
                 FROM (
                   SELECT order_ridden,
                          MAX(version) AS max_version
                   FROM coasters
                   GROUP BY order_ridden
                 ) AS m
                 INNER JOIN coasters
                 ON coasters.order_ridden = m.order_ridden
                 AND COALESCE(coasters.version,0) = COALESCE(m.max_version,0)')
  }

但是,当我尝试将另一个示波器链接到它时,它失败了。有没有办法像正常作用域一样运行此查询?


问题答案:

find_by_sql返回Array。但是您需要ActiveRecord::Relation链接其他作用域。

使用将返回的ActiveRecord方法重写查询的一种方法是将ActiveRecord::Relation其重新排列一点,以使嵌套发生在该INNER JOIN部分中。

您可能想尝试类似的方法:

scope :uniques, lambda {
  max_rows = select("order_ridden, MAX(version) AS max_version").group(:order_ridden)
  joins("INNER JOIN (#{max_rows.to_sql}) AS m
    ON coasters.order_ridden = m.order_ridden
   AND COALESCE(coasters.version,0) = COALESCE(m.max_version,0)")
}


 类似资料:
  • 问题内容: 我在这里遇到了一些问题,我无法发出find_by_sql请求来呈现ActiveRecord关系。确实,我需要一个activerecord关系来提出新请求: 没有activerecord关系,我不能使用“ pluck”。因此,我想我必须将sql请求转换为Activerecord请求。但是,一旦我在ActiveRecord上使用“计数”,我就会遇到一个巨大的问题:最后,我没有ActiveR

  • 问题内容: 我有一个相当复杂的SQL查询,我敢肯定我无法使用ARel(Rails 3.0.10)完成 看看链接,但是它有一些联接和一个子句,而且我敢肯定对于ARel来说太复杂了。 但是我的问题是,在此查询如此复杂之前,我可以使用ARel添加其他模型来避免n + 1问题。现在,我正在使用find_by_sql,请不要使用。我仍然希望能够获取这些记录并将它们附加到我的模型实例上,但是确实不知道如何实现

  • 本文向大家介绍Ruby范围作为序列,包括了Ruby范围作为序列的使用技巧和注意事项,需要的朋友参考一下 示例 范围最重要的用途是表达序列 语法: 要么 最重要的end值必须大于begin,否则将不返回任何值。 例子:            

  • 共享卷性能差(有一些使用其他工具的变通方法,但看起来更像是一个黑客)。不过,对于那些使用Linux的优秀人士来说,这不是一个问题! 我低估了一些前期工作,这些工作是远程运行时与编辑器/IDE良好配合所必需的。linting之类的东西假定本地运行时是现成的,似乎最普遍的解决方案是大量的bash包装脚本将执行委托给docker容器。 此外,我们还雇佣了两个DevOps的家伙,他们有相当多的docker

  • 问题内容: 我试图查询包含年份列的表,并以逗号分隔的年份范围的字符串形式返回这些年份。年份范围将由数组中出现的连续年份确定,非连续年份/年份范围应以逗号分隔。 而不是数据类型的原因是,其中一些值包含而不是年份列表。我们可以忽略这些结果。 到目前为止,我几乎没有运气解决这个问题,因为我什至不知道从哪里开始。 有人可以给我一些指导或提供一些有用的示例来说明如何解决诸如挑战之类的问题吗? 例子 产出目标

  • 问题内容: 我有这种关系:一个用户可以有零只或一只狗,但是一只狗必须属于某人。 我想定义以下范围: 我可以在第一种情况下执行此操作,因为默认情况下,在rails中,联接是INNER JOIN: 1 /这种针对第一个示波器的解决方案是否足够好? 2 /第二个课程你会做什么? 3 /(有一些关联)是否有更好的方法?: 谢谢你的帮助! 问题答案: 对于问题2,我认为以下方法应该有效: 其中include