0

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

4

1 回答 1

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 => date_begenning..date_end

编辑2:确实可以,但我似乎不支持手动构建它。

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

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

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

您的关系还有一个绑定方法。

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

Bu 对于 where 子句,只要它是 Class String 的,activeecord 就会在其上应用一个 .to_sql,所以你不会得到你准备好的语句。

于 2012-09-27T08:59:58.733 回答