首页 > 解决方案 > 如何让 ActiveRecord 在原始语句中绑定?

问题描述

所以我基本上是这样做的:

::OuterModel.where(%{
  EXISTS(SELECT * FROM inner_model 
           WHERE outer_model.id = inner_model.outer_model_id)
             AND inner_model.parameter = ?)
}, 1)

现在问题变成了它在 ActiveRecord 中进行文本替换,它不绑定?1,这反过来又使 ActiveRecords 准备好的语句变得毫无意义,因为每个查询都有不同的1.

我怎样才能对我的EXIST陈述有约束力?

在做一些简单的事情时当然也是如此:

::OuterModel.where('state = ?', 'active')

这里的替代方法不是 do.join或 generate IN,其性能要差得多,或者在我的实际用例中不起作用。

标签: ruby-on-railsactiverecord

解决方案


如果您确定这param是安全的并且您没有从用户端收到它 - 那么您可以使用字符串插值#{1}。如果不是 - 您可以使用插值来清理该值#{ActiveRecord::Base.connection.quote(1)}


推荐阅读