5

私は基本的な Rails 4.0 アプリに取り組んで、それがどのように機能するかを学んでいます。ActiveRecord を介してデフォルトの Sqlite DB にクエリを実行してきましたが、ほとんどのクエリでは、デバッグ出力によると、次のようにパラメータ化されたクエリが生成されるようです。

2.0.0-p247 :070 > file.save
   (0.2ms)  begin transaction
   SQL (0.6ms)  UPDATE "rep_files" SET "report_id" = ?, "file_name" = ?, "updated_at" = ?
   WHERE "rep_files"."id" = 275  [["report_id", 3], ["file_name", "hello.jpg"],
   ["updated_at", Mon, 09 Sep 2013 04:30:19 UTC +00:00]]
   (28.8ms)  commit transaction

ただし、find_by を使用してクエリを実行するたびに、提供されたパラメーターが生成された SQL に貼り付けられているように見えます。

2.0.0-p247 :063 > file = RepFile.find_by(report_id: "29", file_name: "1.png")
  RepFile Load (6.2ms)  SELECT "rep_files".* FROM "rep_files" WHERE
  "rep_files"."report_id" = 29 AND "rep_files"."file_name" = '1.png' LIMIT 1

SQL インジェクションを防ぐために、パラメーターを適切にエスケープしているようです。

2.0.0-p247 :066 > file = RepFile.find_by(report_id: "29", file_name: "';")
  RepFile Load (0.3ms)  SELECT "rep_files".* FROM "rep_files" WHERE
  "rep_files"."report_id" = 29 AND "rep_files"."file_name" = ''';' LIMIT 1

ただし、パラメーター化されたクエリをデータベースに送信することは、クエリ文字列をエスケープしようとするよりも優れたオプションと見なされることを理解していました。これは、パラメーター化されたオプションにより、クエリ データがデータベースの解析エンジンを完全にバイパスするためです。

それで、ここで何が起こっているのですか?これは、Sqlite アダプターまたはデバッグ出力が生成される方法に奇妙な点がありますか? ActiveRecord が実際にこのように動作している場合、何か理由がありますか? 私が見たどこにもこれについて何も見つかりません。ActiveRecord のコードを調べ始めましたが、まだ何もわかりません。

4

1 に答える 1