ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Ruby勉強会@広島コミュのhas_and_belongs_to_many

  • mixiチェック
  • このエントリーをはてなブックマークに追加
【has_and_belongs_to_many】

ActiveRecordを使えば非依存にリンクさせることができます。しかし多対多の関連においてテーブル間は関連づけられます。この多対多のマッピングには特別なマッピングテーブルを使います。

例:
・アルバム毎に一つ以上のカテゴリーに属するCDライブラリー
・ユーザに多くの役割を持たせることができるACL(アクセスコントロールリスト)データベースは多くのパーミッションを持つことができる。
・AccessControlListの例題はどのようにhas_and_belongs_to_manyを使うかをすぐに理解できるデモンストレーションです。(http://mixi.jp/view_bbs.pl?id=5352830&comm_id=270347)

API Documentation on ActiveRecord::Associations(API Documentation on ActiveRecord::Associations )に詳しい詳細があります。

チュートリアル:
ここにrailsでhas_and_belongs_to_manyの実装に必要なモデル、ビュー、コントローラの簡潔に説明したチュートリアルがあります。http://jrhicks.net/96 -jrh

また、ここにこれまた役に立つCheckboxHABTM(http://wiki.rubyonrails.com/rails/pages/CheckboxHABTM)のチュートリアルがあります。

制約:
has_and_belongs_to_manyはすごいのですが、簡単な多対多の関係だけに適しているのです。もし仲介のテーブルが余分なデータを追跡する必要があるのならモデルにその関連を促進することでよりよいものを提供するでしょう。

HABTM(has_and_belongs_to_manyの省略)はこの例ではうまくいきます

| PRODUCTS | OPTIONS_PRODUCTS | OPTIONS
| id <------. | option_id ---------> | id
| name '- | product_id | name

しかしこの例ではうまくいきません

| PRODUCTS | OPTIONS_PRODUCTS | OPTIONS
| id <------. | option_id ---------> | id
| name '- | product_id | name
| price # (Notice the difference)
| price_level_id # (Or, to make things more complex...)

2つめの例では、結合テーブルは関連以上のものを追跡する必要があります。− つまりpriceフィールドやprice_level_id外部キーを読み書きする必要もあります。

これをうまく扱う方法はどうしたらいいのでしょうか?

Justin Palmerの「 Railsを使ってテーブルの結合で余分なデータを格納する」(http://encytemedia.com/blog/articles/2005/06/15/storing-additional-data-on-join-tables-with-rails)で説明しているpush_with_attributesを使うこともできますし、

スキーマを使うってidフィールドにOPTIONS_PRODUCTSを追加し効果的に関連をフル機能なActiveRecordのモデルに結合させることができます。このモデルはHABTMに取ってかわり、IDフィールドが競合するかもしれないので新しいテーブルはHABTMの関連で使えなくなってしまいます。

コメント(0)

mixiユーザー
ログインしてコメントしよう!

Ruby勉強会@広島 更新情報

Ruby勉強会@広島のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング