Rails 3.2强制准备语句

时间:2012-09-27 08:35:19

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 prepared-statement

如果我使用表达式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使用预准备语句?

1 个答案:

答案 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:的确可以,但我似乎不支持手工制作。

您可以手动构建准备好的查询:

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-exec_query

exec_query(sql, name = 'SQL', binds = []) 

您的关系也有绑定方法。

但是两个绑定都需要值有一个名称方法,如果你给一个fixnum,一个哈希等,它们会崩溃。我没有找到任何文件解释这是如何工作的。

Bu为where子句,只要它是Class String,活动ecord就会在其上应用.to_sql,所以你没有得到准备好的语句。