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

时间:2013-02-19 14:41:26

标签: ruby-on-rails rails-activerecord relation

出于好奇 - 我正在阅读Relation::QueryMethods module的文档,并发现了这种方法:

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

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

更新

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

1 个答案:

答案 0 :(得分:9)

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

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

第二个参数称为“绑定”,它是一个与查询中的问号对应的变量数组。你真的想使用binds数组在你的查询中插入参数,因为它避免了你自己做绑定时发生的很多SQL injection危险:

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的{​​{3}}位于@records = eager_loading? ? find_with_associations : @klass.find_by_sql(arel, bind_values) 方法中:

activerecord

您可以在bind gem中搜索“bind_values”,您会在其中找到几个类似的地方。

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