Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails:生のSQLを作成(直書き)して実行させる方法

はじめに

Railsのアプリを作ってて、複数TBLを結合した結果をGROUP BYで集計するような、ちょっと複雑な検索処理が必要となり生のSQLを実行したかったので、そのやり方をメモしましたφ(..)

やりかた

SELECT文の場合は、ActiveRecord::Base.connection.select_allの引数にSQLの文字列を与えてあげればOK(/・ω・)/
返り値をto_hashしてあげれば、[{"column1" => "hoge1","column2" => "hoge2"},{"column1" => "hoge1","column2" => "hoge2"}...]のような形で扱える。

# SQLを作成
sql = <<-"EOS"
SELECT
  pages.name,
  pages.url,
  COUNT(*)
FROM pages
INNER JOIN favorites
  ON pages.id = favorites.page_id
GROUP BY pages.name, pages.url
ORDER BY COUNT(*) DESC
EOS

# sqlを実行し、取得結果をhashに変換
ActiveRecord::Base.connection.select_all(sql).to_hash      

ちなみにUPDATEの場合は、ActiveRecord::Base.connection.executeを使うらしい。

sql = "UPDATE favorites SET read = true"
ActiveRecord::Base.connection.execute(sql)

参考リンク

morizyun.github.io

書いたあとに調べたけど、テーブル同士の結合とかは、ActiveRecordのメソッドを使っても実現出来たかもしれない。。。

qiita.com

おわりに

生のSQLを書くのは、DBを変更(posgresql -> mysql等)の際に不具合の元になったりしそうなので、あまり推奨されないと思いますが、どうしても必要なときもあると思いますので、参考になれば幸いです。