Web制作メモ -トップへ-

RailsのDBアソシエーションのコツ

Ruby2016.03.25 21:38

1対Nの関係の場合、親のモデルクラスにhas_manyを記述し、子のモデルクラスにbelongs_toを記述する。N対Nの関係の場合、それぞれにhas_manyを設定し、中間テーブルを作成し、has_many: throughで結びつける。などの入門書に書いてある事は理解していたが、実際の使い方がいまいちイメージできずにいた。

色々と実験していたところ、belongs_toする(つまり従属する側の)モデルクラスのデータベースに外部キー(xxx_id)が必要で、アソシエーションに関する情報はたったそれだけということが理解できた。逆に、従属される側のデータベースに必要な情報は何もない。

従属される側にもhas_manyと記述するから混乱していたが、has_manyはクラスにメソッドを追加するだけで必須ではない。belongs_toもメソッドを利用しないなら省略できる。どちらか好きなほうで操作するのであれば、好きなほうだけ書いておけばよい。

本を読んでいただけの時には、1対1や1対多、多対多と呼ばれる関係データベースがそれぞれ別物に思えていたが、要は上記の基本の応用の仕方の違いだけで、実際は同じようなものということが分かってきた気がする。

belongs_toで追加されるメソッドで操作する例

item.category = Category.find_by(id: params["category"])
item.save

has_manyで追加されるメソッドで操作する例

Category.find_by(id: params["category"]).items << item