2013年1月5日土曜日

active recordでselect文

active recordでselect文が使える事を最近知りました。以下のような感じ。ここまでくると直接SQL文を書いた方がわかりやすい。
    @shops = Shop.
        joins("left join books as bo on book_id = bo.id").
        joins("left join authors as au on bo.author_id = au.id").
        where("au.name = 'ta-ni-'").
        select("shops.*,bo.name as bname,au.name as aname")
直接の一歩手前
@shops = Shop.find_by_sql("select shops.*,bo.name as bname,au.name as aname from shops left join books as bo on book_id = bo.id left join authors as au on bo.author_id = au.id where au.name = 'ta-ni-'")

通常の方法とfind_by_sqlの方法ではselect文で関連クラスのフィールドも指定しているので、Shopクラスではない項目も取得する事が出来ます。@shop.bname,@shop.aname(p表示ではShopクラスの項目しか表示されないので、直接は読み取れないのだと思っていました。)

 直接(ここまでくるとactiverecordの恩恵は得る事が出来ません)
 @shops2 = ActiveRecord::Base.connection.execute("select shops.*,bo.name as bname,au.name as aname from shops left join books as bo on book_id = bo.id left join authors as au on bo.author_id = au.id where au.name = 'ta-ni-'")
DBが変わるかもしれない事を考えると最初の方法や二番目の方法(find_by_sql)も微妙ですが、activerecordの便利さの恩恵を受けれます。さらに最初の方法はパーツ毎に別れているので、修正がしやすい。 私は出来るだけ最初の方法を採用しようと思っています。

0 件のコメント:

コメントを投稿