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

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

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

■1対1対応の「has_a」

アソシエーションによるテーブルの関連付けのもっとも基本となるものは、「2つのテーブルを1対1で関連付ける」というものでしょう。

あるモデルで、それに関連する別のモデルのレコードが1対1(すなわち、そのモデルのレコード1つに対し、別モデルのレコード1つが関連付けられる)というようなものです。例えば、この2つのモデルを考えてみましょう。メーカーであるmakersテーブルにはメーカーの情報が保管され、goodsには商品の情報が保管されています。

ここで、makersに保管されているメーカーが作った商品を1つだけ、goodsから取り出すということを考えてみましょう。こうしたものに用いられるのが「has_a」というアソシエーションです。これは、モデル内に以下のような文を記述します。
has_a :モデル名
たったこれだけで、指定のモデルとの関連付けが行われます。注意したいのは、このhas_aは「外部キーを持っている側ではなく、外部キーで関連付けられている側に記述する」という点です。この例で言うならば、Makerクラス側に用意します(Goodsクラスではありません)。「アソシエーションは外部キーで関連付けを調べる」……といいましたが、外部キーのないほうにhas_aは用意するのですね。

では、実際にやってみましょう。「models」内から「maker.rb」を開き、そこに書かれているMakerクラスを下のリスト欄のように修正してください。「has_one :good」の1文が追加されただけですね。たったこれだけで、makersテーブルの各レコードに、関連するgoodsテーブルのレコード1つが関連付けられるようになります。

こうして関連付けると、Makerのインスタンスはどう変化するのか? それを知るには、ビューテンプレートを修正する必要があるでしょう。(次ページへ続く)

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

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

●プログラム・リスト●

※Makerクラスの修正

class Maker < ActiveRecord::Base
  attr_accessible :memo, :name, :site
  has_one :good
end
※関連コンテンツ

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