sql - Find_by_sql作为Rails范围

标签 sql ruby-on-rails chaining scopes

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)")
}

关于sql - Find_by_sql作为Rails范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454696/

相关文章:

ruby-on-rails - 使用 Ruby on Rails 安排发送电子邮件任务的最佳方法是什么?

formatting - 格式化长链方法的最佳方法是什么?

javascript - 链接和函数组合

data-structures - 什么时候会重新散列链接哈希表?

PHP 引用类似的查询

mysql - 优化一个在里面使用一些select的请求

java - jOOQ - 重用 SelectConditionStep

mysql - 提取上周数据(而不是过去 7 天)

ruby-on-rails - 在 js.erb 文件中使用 jquery 渲染部分出现错误。渲染不是一个函数

sql - 在Rails WHERE LIKE查询中,百分号是什么意思?