なぜプレースホルダを使用するのか
主な理由は以下の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"]]
こちらはプレースホルダを使用していませんが、さらに短い記述になりましたね!