Ruby on rails ActiveRecord::Relationbind的用途是什么?

Ruby on rails ActiveRecord::Relationbind的用途是什么?,ruby-on-rails,rails-activerecord,relation,Ruby On Rails,Rails Activerecord,Relation,出于好奇-我在阅读的文档中发现了这种方法: def bind(value) relation = clone relation.bind_values += [value] relation end 有人知道这是什么吗?我试图自己找,但失败了 更新 我追踪了@bind_值的使用情况,直到ActiveRecord::ConnectionAdapters的无底深度——这些值一直传递到低级SQL语句执行。似乎各个适配器都可以使用这些。我猜这与准备好的语句有关,比如SELECT*FROM'

出于好奇-我在阅读的文档中发现了这种方法:

def bind(value)
  relation = clone
  relation.bind_values += [value]
  relation
end
有人知道这是什么吗?我试图自己找,但失败了

更新


我追踪了@bind_值的使用情况,直到ActiveRecord::ConnectionAdapters的无底深度——这些值一直传递到低级SQL语句执行。似乎各个适配器都可以使用这些。我猜这与准备好的语句有关,比如SELECT*FROM'table',其中'field'=?,但我被困在这里了。有人吗

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

Post.find_by_sql("SELECT title FROM posts WHERE author_id = ?", [author_id])
第二个参数称为binds,它是一个变量数组,对应于查询中的问号。您确实希望使用绑定数组向查询中插入参数,因为如果您自己进行绑定,它可以避免很多危险:

Post.find_by_sql("SELECT title FROM posts WHERE author_id = #{author_id}")
那么,这与ActiveRecord::关系有什么关系呢?AREL的要点是,您可以通过调用ActiveRecord::Relation对象上的方法一次构建一个查询。这些方法有很多,下面是一些列表:

因此bind方法通过克隆当前对象生成一个新对象,将指定的值添加到bind_值列表中,然后返回新对象。最后,当关系用于生成查询时,该值将发现自己被用于进行查询。在exec\u querys方法中,通过\u sql传递bind\u值以查找\u:

您可以在activerecord gem中搜索bind_值,您将找到使用它的几个类似位置


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

谢谢,但我已经想好了,请看我问题的“更新”部分-+1。我同意你的看法,那可能是一种遗留物;另一个假设是,该工具用于需要它的特定适配器。在postgres适配器的源代码中,我还没有看到它实际使用这些值。我尝试了一些类似Model.where field=。绑定值。但绑定值不显示在查询中。所以我猜它可能会被一些适配器使用,这些适配器将构建准备好的预编译语句?我不会说这是一个完整的答案,但你是唯一一个尝试过的人,所以赏金是给你的。谢谢,谢谢!对不起,我想不出什么了。我想你可以问问Rails的维护人员。
@records = eager_loading? ? find_with_associations : @klass.find_by_sql(arel, bind_values)