こんにちは、宮﨑です。
今回はタイトルに記載してある通りRuby on Railsにてexecuteメソッドを利用して生SQL文を書かなければならない時の知見についてまとめていこうと思います。
そもそもexecuteって何?
ActiveRecordから生SQLを実行する際に必要になるメソッドとなります。
他にも生SQL文を書く際に便利なメソッドがいろいろあるので、気になる方は下記リンクを見てみてください。
何でexecute(生SQL文)を利用しなければいけないのか
こちらの理由としましては、下記リンクのRailsガイドにも記載されているように、Active Recordでは単一カラムの外部キーのみがサポートされており、複合外部キーを使う場合はexecuteもしくはstructure.sqlが必要となっています。
また、既存の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に関してはほとんど見かけなかったため、筆を取らせていただきました。
まだまだ経験が浅く説明不足な部分もありますが、こちらの記事を閲覧した人の役に立てれば幸いです。