アソシエーションの利用 (5/5)
作成:2012-11-03 10:14
更新: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つと全く同様で、
実際の動作を見るために、index.html.erbを修正してみましょう(これは、「goods」のindex.html.erbですよ。「makers」のほうではないので間違えないように!)。やはり、一覧表示のテーブル部分を下のリスト欄に掲載しておきます。これで実行すると、それまでmakersのID番号が表示されていただけのMakerの欄に、メーカー名が表示されるようになります。この部分を見ると、
belongs_toも、使い方そのものはhas_aと全く変わりありません。ただ、関連付ける側が違うだけなのです。外部キーをおいてあるテーブルの側から、関連付けているテーブルのレコードを取り出すときはbelongs_toを使う、と覚えておいてください。
ここで取り上げた「has_a」「has_many」「belongs_to」は、アソシエーションのもっとも基本となるものです。これらを確実にしっかり使えるようになれば、ちょっとしたレコードの関連付けなどぱぱっと作れるようになりますよ!
この場合、「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」は、アソシエーションのもっとも基本となるものです。これらを確実にしっかり使えるようになれば、ちょっとしたレコードの関連付けなどぱぱっと作れるようになりますよ!
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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>
※関連コンテンツ