在不进行插值的情况下重写此查询的最佳方法是什么?
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 注入开放。我只是简单地加入从子查询中选择的案例,而不是将子查询放入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")
(注意去掉了多余的WHERE
外部条件SELECT
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)