RailsでSQLを直接実行するfind_by_sqlについての紹介。
RailsでのSQL直接実行にはfind_by_sqlがベスト
RailsでSQLを直接実行する方法はたくさんありますが、その中でベストなのは find_by_sql だと思います。その理由はこんな感じ。
- ごちゃごちゃした初期化が不要
- プレースホルダを簡単に使える
- テーブルのカラムにドットでアクセスできる
find_by_sqlの使い方はこんな感じ。
users = User.find_by_sql(['select * from users where id = ?', 1]) puts users.class.name => "Array" puts users.first.class.name => "User" puts users.first.id => 1 # 名前付きプレースホルダバージョン users = User.find_by_sql(['select * from users where id = :id', {id: 1}])
find_by_sql以外の方法
find_by_sql以外の方法もついでに紹介。
ActiveRecord::Base.connection.select_all
返り値はActiveRecord::Result、各要素はHashになっておりドットアクセスができない。プレースホルダーもActiveRecord::Base::sanitizeとかを使わないと利用できない。
ActiveRecord::Base.connection.execute
返り値はMysql2::Result。各要素の取得に一手間必要で面倒。
ActiveRecord::Base.connection.select
select_allとほぼ一緒。同じようなメソッドとしてdelete, insertもあるらしい。
参考リンク
最近のいけてる人たちが作ったRails掲示板Webアプリケーション。Railsのベストプラクティス的なのがつまりまくってる。
RailsでSQLを直打ちする方法 ~使うメソッドの違いによる戻り値の違い~
【Rails】ActiveRecord経由せずにsql直接実行する方法がたくさんあるの知らなかった…
【rails】これは便利!「.find_by_sql()」でも「?」が使えてびびった話