7

好奇心から - 私はRelation::QueryMethods モジュールのドキュメントを読んでいて、そのメソッドを見つけました:

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

これは何だか分かる人いますか?自分で見つけようとしましたが、失敗しました。

アップデート

@bind_valuesの底なしの深さまでの使用法を追跡しましたActiveRecord::ConnectionAdapters-値は、低レベルのSQLステートメントの実行まで何度も渡されます。個々のアダプターがこれらを使用しているようです。のような準備済みステートメントと関係があると思いますがSELECT * FROM 'table' WHERE 'field' = ?、ここで立ち往生しています。誰?

4

1 に答える 1

9

まず、 ActiveRecordが提供するfind_by_sqlメソッドについて説明します。このメソッドは次のように使用できるようです。

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

2番目のパラメーターは「バインド」と呼ばれ、クエリの疑問符に対応する変数の配列です。バインド配列を使用してパラメーターをクエリに挿入する必要があります。これは、バインドを自分で行った場合に発生するSQLインジェクションの危険性を回避できるためです。

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、新しいオブジェクトを返します。最終的に、リレーションを使用してクエリを生成すると、その値自体がクエリの作成に使用されていることがわかります。getが渡される1つのは、メソッドにあります。bind_valuesfind_by_sqlexec_queries

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

gemで「bind_values」を検索するactiverecordと、それが使用されている同様の場所がいくつか見つかります。

bindメソッドはによって呼び出されると思っていたのwhereですが、activerecordのどこにも呼び出されていないようです。たぶんそれは古いデザインからの残り物です。bind私はあなたがあなたのアプリで呼び出すべきではないと思います。

于 2013-02-21T17:11:38.357 に答える