如果我使用表达式Model.find(1)
,则rails会将其作为预处理语句执行:SELECT "models".* FROM "models" WHERE "models"."id" = $1 LIMIT 1 [["id", 1]]
但是当我使用Model.where("id = ?", 1)
时,它会在没有预备语句的情况下执行:SELECT "models".* FROM "models" WHERE (id = 1)
在这种情况下如何强制rails使用预准备语句?
答案 0 :(得分:0)
我不确定你能不能。
但是
Model.where(:id => 1)
应该生成准备好的声明。片段字符串的工作方式不同,因此您可以在自定义情况下准确生成所需内容。
编辑:
尝试这个,我不确定它是否有效,我现在可以'测试一下,但它看起来像你需要的那样:
Client.where("created_at >= :start_date AND created_at <= :end_date",
{:start_date => params[:start_date], :end_date => params[:end_date]})
更多信息:http://guides.rubyonrails.org/active_record_querying.html#conditions
在占位符部分。此外,日期范围以数组格式工作:
:date =&gt; date_begenning..date_end
编辑2:的确可以,但我似乎不支持手工制作。
您可以手动构建准备好的查询:
exec_query(sql, name = 'SQL', binds = [])
您的关系也有绑定方法。
但是两个绑定都需要值有一个名称方法,如果你给一个fixnum,一个哈希等,它们会崩溃。我没有找到任何文件解释这是如何工作的。
Bu为where子句,只要它是Class String,活动ecord就会在其上应用.to_sql,所以你没有得到准备好的语句。