ruby-on-rails - 原始 SQL 请求中的 Rails 4 字符串插值

标签 ruby-on-rails ruby postgresql ruby-on-rails-4

在没有插值的情况下重写此查询的最佳方法是什么?

def case_joins(type)
  subquery = <<-SQL.squish
    SELECT id FROM cases c2
    WHERE c2.title_id = titles.id AND c2.value = 0 AND c2.type = '#{type}'
    ORDER BY c2.created_at DESC LIMIT 1       
  SQL
  "LEFT OUTER JOIN cases ON cases.title_id = titles.id AND cases.value = 0 AND cases.type = '#{type}' AND cases.id = (#{subquery})"
end

最佳答案

我假设您想避免变量插值,因为它对 SQL 注入(inject)开放,所以这是危险的。我会简单地加入从子查询中选择的案例,而不是将子查询放入 WHERE 条件中。这确实涉及插值,但仅限于 AR 生成的 SQL。我还将其实现为一个范围,以利用 AR 范围链:

class Title < ActiveRecord::Base
  def self.case_joins(type)
    case_query = Case.from("cases c").where(c: {title_id: title_id, value: 0, type: type}).order('c.created_at DESC').limit(1)
    joins("LEFT OUTER JOIN (#{case_query.to_sql}) cases ON cases.title_id = titles.id")
  end
end

这样,您就可以像这样将范围链接到其他范围:

Title.where(attribute1: value1).case_joins("typeA")

(请注意,删除了外部 SELECT 中多余的 WHERE 条件。)

关于ruby-on-rails - 原始 SQL 请求中的 Rails 4 字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455508/

相关文章:

ruby-on-rails - 如何在 RSpec 中删除 years.ago 隐式引用的日期?

ruby - Perl 替代在 Ruby %x{} 中使用时未询问时插入垃圾

database - createuser 无法连接到数据库 postgres

postgresql - 有没有办法将 SELECT 的结果用作查询中的列标识符? (PostgreSQL)

ruby-on-rails - 到 'ws://example.com/cable' 的 WebSocket 连接失败 : Unexpected response code: 404

ruby-on-rails - 重置密码的问题 - Devise

ruby-on-rails - Rails 3.1,RSpec : testing model validations

ruby - 如何从文件中获取特定行

ruby-on-rails - 检查用户是否提供了图像?

mysql - SQL 统计字段中的单词数