libro
www.tuyano.com
初心者のためのRuby on Rails3入門

アソシエーションの利用 (5/5)

作成:2012-11-03 10:14
更新:2012-11-03 10:14

■逆方向から関連付ける「belongs_to」

今度は、関連付けの向きを「逆」にしてみましょう。例えば、今までの例では、メーカーのモデルMakerから、そのメーカーが作った商品のモデルGoodを取り出しました。今度は逆に、商品のGoodから、その商品を作ったメーカーのMakerを取り出す方法を考えてみましょう。

この場合、「Goodクラスにhas_aをつければいいじゃないか」という考えは通用しません。テーブルの内容をよく思い出しましょう。makersテーブルには、good_idといった外部キーはありません。has_aは「外部キーで関連付けられている側(つまり外部キーがないほう)」に用意するものですから、Goodには使えないのです。

このような「has_a/has_manyの逆向きの関連付け」を行う場合に用いられるのが「belongs_to」というアソシエーションです。使い方はこれまでの2つと全く同様で、
belongs_to :モデル名
このようにモデルクラスに記述するだけです。例として、Goodクラスにbelongs_toを追加したサンプルを下のリスト欄に掲載しておきました。これで、Goodから、関連するMakerを取り出すことができるようになります。

実際の動作を見るために、index.html.erbを修正してみましょう(これは、「goods」のindex.html.erbですよ。「makers」のほうではないので間違えないように!)。やはり、一覧表示のテーブル部分を下のリスト欄に掲載しておきます。これで実行すると、それまでmakersのID番号が表示されていただけのMakerの欄に、メーカー名が表示されるようになります。この部分を見ると、
<%= good.maker.name %>
このように、makerプロパティのnameを出力していることがわかります。先ほどのmaker.goodとまったく同様に、ここではgoodに「maker」というプロパティが用意され、そこに関連するMakerインスタンスが設定されているのです。

belongs_toも、使い方そのものはhas_aと全く変わりありません。ただ、関連付ける側が違うだけなのです。外部キーをおいてあるテーブルの側から、関連付けているテーブルのレコードを取り出すときはbelongs_toを使う、と覚えておいてください。

ここで取り上げた「has_a」「has_many」「belongs_to」は、アソシエーションのもっとも基本となるものです。これらを確実にしっかり使えるようになれば、ちょっとしたレコードの関連付けなどぱぱっと作れるようになりますよ!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※Goodクラスの修正

class Good < ActiveRecord::Base
  attr_accessible :maker_id, :memo, :name, :price, :star
  belongs_to :maker
end


※index.html.erbの修正

<table>
  <tr>
    <th>Name</th>
    <th>Maker</th>
    <th>Price</th>
    <th>Star</th>
    <th>Memo</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @goods.each do |good| %>
  <tr>
    <td><%= good.name %></td>
    <td><% if good.maker != nil %>
        <%= good.maker.name %>
    <% end %></td>
    <td><%= good.price %></td>
    <td><%= good.star %></td>
    <td><%= good.memo %></td>
    <td><%= link_to 'Show', good %></td>
    <td><%= link_to 'Edit', edit_good_path(good) %></td>
    <td><%= link_to 'Destroy', good, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
</table>

※関連コンテンツ

「初心者のためのRuby on Rails3入門」に戻る