首先,我想解释一下按sql查找 http://apidock.com/rails/ActiveRecord/Base/find_by_sql/classActiveRecord 提供的方法。看起来这个方法可以这样使用:
Post.find_by_sql("SELECT title FROM posts WHERE author_id = ?", [author_id])
第二个参数称为“binds”,它是与查询中的问号相对应的变量数组。您确实想使用绑定数组将参数插入查询中,因为它避免了很多SQL注入 http://en.wikipedia.org/wiki/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 http://apidock.com/rails/v3.2.8/ActiveRecord/QueryMethods
So the bind
方法通过克隆当前对象来创建一个新对象,添加指定的value
到列表bind_values
,然后返回新对象。最终,当该关系用于生成查询时,该值将发现自己被用于进行查询。一example https://github.com/rails/rails/blob/b4051edf841c8a6780df9af7afa9892bfd811c79/activerecord/lib/active_record/relation.rb#L565 where bind_values
传递给find_by_sql
在里面exec_queries
method:
@records = eager_loading? ? find_with_associations : @klass.find_by_sql(arel, bind_values)
您可以在以下位置搜索“bind_values”activerecord
gem,你会发现几个类似的地方正在使用它。
我本以为bind
方法将被调用where
,但它似乎没有在 activerecord 中的任何地方被调用。也许这是旧设计的遗留物。我认为你不应该打电话bind
在你的应用程序中。