---

こんにちは〜

【Rails】生SQLを書きたいとき

今までなかったけど、生SQLを書かないといけなくなったので調べた。
SQLを書きたい・変数を渡したい(プレースホルダを使いたい)時の方法。

を使う

ids = [1, 2, 3]

# 5.2以上
sql = ActiveRecord::Base.sanitize_sql_array(['SELECT * from users WHERE id IN (:ids)', ids: ids])

# 5.2より前のバージョン
sql = ActiveRecord::Base.send(
  :sanitize_sql_array,
  ['SELECT * from users WHERE id IN (:ids)', ids: ids]
)

ActiveRecord::Base.connection.select_all(sql).to_hash

sanitize_sql_arrayは5.2からpublicメソッドになってるらしい。 5.0系だと、protected methodです!と怒られるのでsendしないといけない😕

> ActiveRecord::Base.sanitize_sql_array(['select id from users where id=?', 111])
NoMethodError: protected method `sanitize_sql_array' called for ActiveRecord::Base:Class

参考

https://qiita.com/yut_h1979/items/4cb3d9a3b3fc87ca0435 https://techracho.bpsinc.jp/hachi8833/2018_08_13/60583 https://stackoverflow.com/questions/12755969/rails-prepared-statement-with-select-all https://api.rubyonrails.org/classes/ActiveRecord/Result.html