5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsのwhere句でプレースホルダを使用する

Posted at

なぜプレースホルダを使用するのか

主な理由は以下の2つです。

  1. クエリに変数を書くため
  2. SQLインジェクションを防ぐため

書き方

where句の基本形

モデル名.where(条件)

プレースホルダを使用しない記述

Category.where("name = 'fashion'")
# SELECT "categories".* FROM "categories" WHERE (name = 'fashion')

categoriesテーブルのnameカラムにfashionが入っているレコードを取得しています。

プレースホルダを使用する記述

Category.where('name = ?', 'fashion')
# SELECT "categories".* FROM "categories" WHERE (name = 'fashion')

プレースホルダの有無に関わらず、同じクエリが出力されていますね。上記の例はハードコーディングですが、変数を使用する場合は以下のような記述となります。

Category.where('name = ?', params[:category_name])

プレースホルダ+IN句の記述

Category.where('name IN (?)', ['fashion', 'vehicles', 'food'])
# SELECT "categories".* FROM "categories" WHERE (name IN ('fashion','vehicles','food'))

同カラム内でのOR検索をしたい場合、こちらの方がすっきりした記述ですね!

おまけ

ハッシュを使用して同カラムでOR検索する記述

Category.where(name: ['fashion', 'vehicles', 'food'])
# SELECT "categories".* FROM "categories" WHERE "categories"."name" IN ($1, $2, $3)  [["name", "fashion"], ["name", "vehicles"], ["name", "food"]]

こちらはプレースホルダを使用していませんが、さらに短い記述になりましたね!

参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?