Arel::Tableを使ってなるべく生のSQLを書かずに済ます方法|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。Arel::Tableを使ってなるべく生のSQLを書かずに済ます方法tsunekawaシェアツイートブックマークLINERailsでプログラムを書いるとSQLを直接記述する機会が意外と多いので、なるべくRubyらしく書く方法がないか調べてみました。ORなどかなり基本的な構文でもarel_tableを使う必要があるのですね。動作確認環境は以下の通りです。'花子')"なるべくRubyで書こうとするとこうなります。今後はもっと簡単に書けるようになるかもしれません。=(イコール)に変換されます。他によく使うものでは不等号がありますが、これは以下のメソッドが対応しています。等に独自のメソッドが存在します。詳しくはGitHubのページ等を参照して下さい。サブクエリを使うArel::Tableを利用すれば、サブクエリを使ったSQLを生成することができます。以下はホワイトリストにまだ登録されていないユーザーを選択する場合を例にしたサンプルです。ActiveRecord単体ではこのように書いていました。(1,2,3))"Arel::Tableでサブクエリを利用した場合は以下のようになります。))"ActiveRecord単体で生成する場合は2度クエリを発行していますが、サブクエリをつかえば一度発行するだけで済みます。単純なクエリでは影響は少ないかもしれませんが、複雑なテーブル構成のデータの場合はパフォーマンスの向上が見込める場合もあるのではないでしょうか。ENDSQLこの例は短いですが、複雑なqueryではかなりの行をSQLの記述が占めてしまうのではないでしょうか。多用してしまうと見にくくなってしまいます。スコープやクラスメソッドとして定義して再利用できるquery生成をメソッドに切りだすことで、Controller等から呼び出すことができるので似たような検索を何度も行う場合はDRYに書くことができます。オブジェクトとして取得されます。連結したり検索条件を追加したりといったことができるようになります。複数のscopeを組み合わせて複雑なqueryを作り上げるという使い方ができそうですね。9.2.2で動作を確認しました。生のSQLを使っているとサーバ移転等で環境が変わった際にソースコードの修正が必要になる場合があります。Arelを適切に使っていればそういった変更が不要になるかもしれません。Rails4でも動きますそろそろRails4の正式版がリリースされますね。環境で動作するか確認してみました。5.1.65例に上げたような単純なqueryであれば問題なく動作するようです。scopeを利用した場合の例だけは少し問題があります。scopeの書き方が変わったようなので、指示の通りに書き換えます。}endこれで警告も出なくなるはずです。以上、簡単な例でしたがArelの使い方をまとめてみました。便利なのでどんどん使いましょうとは言い難いですが、Arelのメソッドはなんだかかっこいいですね。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。