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 件のコメント:
コメントを投稿