TIM Labs

2013年10月アーカイブ

ActiveRecord4でこんなSQLクエリどう書くの? Merge編 では、関連先のscopeを使うことができるmergeを紹介しました。mergeを使う事で、変更に強いクエリを美しく組み立てることができました。

今回は、ActiveRecord4で書きにくいSQLクエリたちを紹介します。 書きにくいクエリとは、具体的には以下のものがあげられます。

  • 比較演算
  • OR
  • like
  • left outer join
  • union
  • サブクエリ
  • exists

ActiveRecordでこれらのクエリを組み立てる場合、どうしても美しくない(SQL文字列をべったり書いてしまうような)書き方となってしまいがちです。 この処理を美しく書くためには、ActiveRecordだけの機能では足りず、ActiveRecordが内部で使っているArelというライブラリを使う必要がでてきます。

今回は、Arelを使って華麗にSQLクエリを組み立てる方法を紹介します。

「このデータ取得するのにSQLではこういう風に書けばいいんだけど、ActiveRecordでは一体どう書けばいいの?」

毎回この課題に悩まされています。

特に業務アプリの場合、とてつもなく複雑なSQLを投げる場合があります。 ものすごい数のテーブルをjoinして、existsで条件みて、union allして。。。 なんていう処理がでてくると、さすがにActiveRecordやDatamapperを使ってクエリを組み立てるのをあきらめて、直接SQLを書いてしまうことがあります。

でも、できればActiveRecordを使ってスマートにSQLを組み立てたいものです。 scopeで書いておけば、処理も使い回せますしね。

ということで、こういうSQLはActiveRecordではこういう風に書けばできますよ!っていうサンプルを色々かいてみることにしました。

第一弾は、たぶんActiveRecordで最も便利な機能、mergeを使ったサンプルを紹介します。 これが使えると処理が綺麗にかけるし、使い回せるようにもなるし、ActiveRecordすごい!って思えるようになります。

このアーカイブについて

このページには、2013年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2013年9月です。

次のアーカイブは2013年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。