その他

executeメソッドを利用してCreateとUpdateを行う際の生SQL文の書き方【Ruby on Rails】

この記事は約3分で読めます。

こんにちは、宮﨑です。

今回はタイトルに記載してある通りRuby on Railsにてexecuteメソッドを利用して生SQL文を書かなければならない時の知見についてまとめていこうと思います。

そもそもexecuteって何?

ActiveRecordから生SQLを実行する際に必要になるメソッドとなります。

他にも生SQL文を書く際に便利なメソッドがいろいろあるので、気になる方は下記リンクを見てみてください。

ActiveRecordで生SQLを使いたいときに便利なメソッド達 - Qiita
Ruby で DB を扱うちょっとしたスクリプトを書くとき、ActiveRecord で生SQLを使うと色々捗ることが多い。そのためのメソッドをまとめてみた。事前準備: establish_co…

何でexecute(生SQL文)を利用しなければいけないのか

こちらの理由としましては、下記リンクのRailsガイドにも記載されているように、Active Recordでは単一カラムの外部キーのみがサポートされており、複合外部キーを使う場合はexecuteもしくはstructure.sqlが必要となっています。

Active Record マイグレーション - Railsガイド
Active Recordのマイグレーション (migration) を使用して、データベースを構造化された方法で整然と変更する方法について解説します。

また、既存のActiveRecordのメソッド(where)等では対応できない複雑な処理を行う際にも利用する必要があります。

今回は中間テーブルなど複合外部キーのものを変数を利用して作成(POST)・更新(UPDATE)する際の生SQLの書き方をまとめていこうと思います。

POST (insert)

args = ['INSERT INTO テーブル名 (カラム1名,カラム2名,カラム3名,カラム4名) values (?, ?, 0, ?)',
       カラム1の値の変数, カラム2の値の変数, カラム4の値の変数]
sql = ActiveRecord::Base.send(:sanitize_sql_array, args)
result = ActiveRecord::Base.connection.execute(sql)

こちらを実行することで

カラム名1 : カラム1の値の変数,

カラム名2 : カラム2の値の変数 ,

カラム名3: 0 ,

カラム名4 : カラム4の値の変数

のレコードが作成されます

UPDATE(update)

args = ['UPDATE テーブル名 SET カラム1名 = ? ,カラム2名= ? カラム3名 = ? 
        WHERE 検索カラム1 = ? AND 検索カラム2 = ?',
       カラム1の値の変数, カラム1の値の変数, カラム1の値の変数, 検索カラム1の値の変数, 検索カラム2の値の変数]
sql = ActiveRecord::Base.send(:sanitize_sql_array, args)
result = ActiveRecord::Base.connection.execute(sql)

こちらを実行することで

検索条件が

検索カラム1 = 検索カラム1の値の変数

検索カラム2 = 検索カラム2の値の変数

更新内容が

カラム1名 = カラム1の値の変数

カラム2名 = カラム2の値の変数

カラム3名 = カラム3の値の変数

となります。

まとめ

こちらの記事はexecuteを利用した際にcreateに関する資料は多く見つかったのに対してupdateに関してはほとんど見かけなかったため、筆を取らせていただきました。

まだまだ経験が浅く説明不足な部分もありますが、こちらの記事を閲覧した人の役に立てれば幸いです。

その他参考資料

Railsの生SQL概要:execute, select_all, find_by_sqlの使い方を覚える - Qiita
Railsで使用する生SQLRailsにおいて、ActiveRecordのwhere等では表現できない複雑なクエリを使用してDBのデータを取得する場合、生でSQLを書く必要が出てくると思います。…