Railssanitize_sql_for_conditions
在内部使用来处理占位符。当然,该方法受到保护,因此您不能(干净地)在 ActiveRecord 模型之外使用它。您可以使用以下方法绕过保护send
:
nearest = Site.minimum(
Site.send(:sanitize_sql_for_conditions, [
'abs(latitude - ?) - abs(longitude - ?)',
params[:lat].to_f, params[:lon].to_f
]
)
或者您可以将该逻辑放在一个Site
类方法中,这样您就可以在sanitize_sql_for_conditions
没有欺骗的情况下使用:
class Site < ActiveRecord::Base
def self.whatever_this_is(lat, lon)
minimum(
sanitize_sql([
'abs(latitude - ?) - abs(longitude - ?)',
lat, lon
])
)
end
end
然后在你的控制器中:
nearest = Site.whatever_this_is(params[:lat].to_f, params[:lon].to_f)
记下to_f
电话。如果你不包括那些,那么params[:lat]
将params[:lon]
是字符串,sanitize_sql_for_conditions
并将引用它们:
abs(latitude - '11.23') - abs(longitude - '42.6')
您的数据库可能会也可能不高兴看到您尝试从数字中减去字符串,因此最好准确说出您的意思并自己进行类型转换。