gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:26:38 24 4
gpt4 key购买 nike

只是出于好奇 - 我正在阅读 Relation::QueryMethods module 的文档并找到了该方法:

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

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

更新

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

最佳答案

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

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

第二个参数称为“绑定(bind)”,它是与查询中的问号相对应的变量数组。您确实想使用绑定(bind)数组将参数插入到查询中,因为它避免了很多 SQL injection如果您自己进行绑定(bind)会发生危险:
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方法通过克隆当前对象创建一个新对象,添加指定的 valuebind_values 的列表中,然后返回新对象。最终,当关系用于生成查询时,该值将发现自己被用于进行查询。一个 example在哪里 bind_values转至 find_by_sqlexec_queries方法:
@records = eager_loading? ? find_with_associations : @klass.find_by_sql(arel, bind_values)

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

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

关于ruby-on-rails - ActiveRecord::Relation#bind 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14960135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com