前回までのプログラミング学習コラムに続き8回目の勉強内容です。
コラムの連載をさせていただいている小林寛和(ひろかず)です。Ruby on Railsのコラムの第8回目となります。今回はモデルに関連したDBを新しく作り、Railsで処理をしてみましょう。その際、コードを綺麗に書くという点を意識しながら説明していこうと思います。
新しいデータベースを関連付けるメリット(コードを綺麗に書く)
無理やり既存のデータベースに結びつけると、どうなるか(汚いコードの例)
抽象的でよく分からないので、具体例を出してみます。例えば、携帯ショップのまとめサイトを作っているとしましょう。もう既にShopモデルを作り、Shopの情報は管理できました。しかし、あなたはそこで店にある在庫情報を管理しなければならなくなりました。
もしかしたら在庫情報と言っても売れ筋の3つ程を載せる程度で、既存のShopモデルに売れ筋情報を結びつけるだけでもいいかもしれません。しかし、それだけでは汎用性や拡張性は皆無で、ViewやController側でも汚いコードを書かなければいけなくなるでしょう。
ここに例を示します。
- Controller内のshowメソッド
def show @shops = Shop.find(params[:id]) @mobiles = { @shop.mobile_1_name => @shop.mobile_1_price, @shop.mobile_2_name => @shop.mobile_2_price, @shop.mobile_3_name => @shop.mobile_3_price } end
- Views内のshow.html.erb内のループ
-
<% @mobiles.each do |mobile| %> <p>name: <%= mobile.key %>, price: <%= mobile.value %>.</p><% end %>
データベースを切り分けないと拡張性が低くなり、可読性が下がる
私の書き方が悪いのもありますが、可読性が低いです。Controller内でHashオブジェクトを生成していますが、ループで回すことも出来ず、コードが長くなってしまっています。もし商品を5つ扱うとなると、いちいちHashに子要素を追加しなくてはなりません。そして、Viewの方でもmobile.keyやmobile.valueといった、何の値が格納されているのか全く分からない仕様になってしまっています。
データベースを切り分けると拡張性が高くなり、可読性が上がる(綺麗なコードになる)
これらを新しくモデルを作ると以下のように書きなおすことが出来ます。
- Controller内のshowメソッド
def show @shop = Shop.find(params[:id]) @mobiles = Shop.find(params[:id]).mobiles end
- Views内のshow.html.erb内のループ
-
<% @mobiles.each do |mobile| %> <p>name: <%= mobile.name %>, price: <%= mobile.price %>.</p> <% end %>
まずController側です。Shopオブジェクト.mobilesで存在するmobileを全て取ってきてくれます。コードの方も非常にシンプルになりました。シンプルになったことで、急な仕様変更で商品を5つ扱うことになった場合などにもコードを変更する必要がなくなり、拡張性も上がりました。
また、View側でもmobile.nameやmobile.priceというように、何を呼び出しているのかがぱっと見で分かるようになり、可読性が上がりました。
まとめ
今回はまだ実装はしていませんが、モデルを切り分けることで得られるメリットと、その実例を示しました。既存のモデルに対して、複数の関連した情報を結び付けたいという事は多々あるかと思います。これらを無理やり既存のモデルに結びつけるとテーブルがごちゃごちゃになり、それによってControllerやView側のコードも拡張性が下がり、可読性が下がってしまいました。
しかし、これらをモデルを切り分けることで綺麗なコードにすることが出来ました。でも、綺麗なコードってなんでしょう。出来るだけ少ないコードで書くことですか?コメントを書いてわかりやすくすることですか?
次回予告
次回はモデルを切り分ける実装の前に、一度綺麗なコードとは何かについて考えてみましょう。