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
。