加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – ActiveRecord :: Relation#bind的目的是什么?

发布时间:2020-12-16 23:12:58 所属栏目:百科 来源:网络整理
导读:出于好奇 – 我正在阅读 Relation::QueryMethods module的文档并发现了这个方法: def bind(value) relation = clone relation.bind_values += [value] relationend 有谁知道这是什么?我试图自己找,但失败了. UPDATE 我将@bind_values的使用情况跟踪到Activ
出于好奇 – 我正在阅读 Relation::QueryMethods module的文档并发现了这个方法:
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 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方法通过克隆当前的对象来创建一个新对象,将指定的值添加到bind_values列表中,然后返回新对象.最终,当关系用于生成查询时,该值将发现自己用于进行查询. bind_values传递给find_by_sql的一个example在exec_queries方法中:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读