アソシエーションの利用 (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>
※関連コンテンツ