ActiveRecord :: Relation#bind的目的是什么?

出于好奇 – 我正在阅读Relation :: QueryMethods模块的文档,并发现该方法:

def bind(value) relation = clone relation.bind_values += [value] relation end 

有谁知道这是什么? 我试图自己找,但失败了。

UPDATE

我将@bind_values使用情况跟踪到ActiveRecord::ConnectionAdapters的无底深度 – 值继续传递,直到执行低级SQL语句。 似乎各个适配器可能会使用这些。 我的猜测是它与预处理语句有关,比如SELECT * FROM 'table' WHERE 'field' = ? ,但我被困在这里。 任何人?

首先,我想解释一下ActiveRecord提供的find_by_sql方法。 看起来这个方法可以像这样使用:

 Post.find_by_sql("SELECT title FROM posts WHERE author_id = ?", [author_id]) 

第二个参数称为“绑定”,它是一个与查询中的问号对应的变量数组。 您确实希望使用binds数组将参数插入到查询中,因为它可以避免在您自己执行绑定时发生的大量SQL注入危险:

 Post.find_by_sql("SELECT title FROM posts WHERE author_id = #{author_id}") 

那么,这与ActiveRecord :: Relation有什么关系呢? AREL的要点是,您可以通过调用ActiveRecord :: Relation对象上的方法一次建立一个查询。 有很多这些方法,这里有一些列表:

http://apidock.com/rails/v3.2.8/ActiveRecord/QueryMethods

因此, bind方法通过克隆当前的对象来创建一个新对象,将指定的value添加到bind_values列表中,然后返回新对象。 最终,当关系用于生成查询时,该值将发现自己用于进行查询。 将bind_values传递给find_by_sql一个示例位于exec_queries方法中:

 @records = eager_loading? ? find_with_associations : @klass.find_by_sql(arel, bind_values) 

您可以在activerecord gem中搜索“bind_values”,您会发现几个类似的地方正在使用它。

我原以为bind方法会被where调用,但似乎在activerecord中的任何地方都没有调用它。 也许它是旧款设计的遗留物。 我不认为你应该在你的应用程序中调用bind