ActiveRecord の find_by_sql

RailsActiveRecord 等の O/R を使うと CRUD+αの範囲ではきれいにSQLを排除できるけど、実際にアプリを作るとそれだけでは対応できない。
belongs_to や has_many を駆使するとなんとかできるけど、SQL なら 1回でできる操作なのに、何度も検索するハメになったりする。

Rails ではそれに対応するため、find_by_sql というメソッドが定義されている。それだけなら、他の O/R マッパーでもあるんだけど、Rails のすごいところは select 句に書いた別名(as 〜って言うやつ)がそのまま属性の名前として使えるところ。

例えば以下のようなテーブルがあるとする。

items
 create table items (
   id int auto_increment primary key,
   name varchar(100)
 );
order_items
 create table order_items (
   id int auto_increment primary key,
   items_id int,
   price int,
   pty int
 );

これに対して合計金額や項目名を一緒にとりたい場合は以下のようにすると item_name や total で値が取得できる。

  @records = OrderItem.find_by_sql(
      " select i.name as item_name, oi.price, oi.qty, oi.price*oi.qty as total " +
      " from items as i, order_items as oi " +
      " where i.id = oi.item_id ")

  @records[0].item_name
  @records[0].total