takecian

Diary

01 Dec 2013

Rails で Model に 1 対多の関連をもたせる

最近進捗がなかった Rails ネタ。というか今作ってるやつ

ググるとよく出てくる Model に1対多の関連を持たせる、という話。

belongs_to と has_many メソッドを使う。
子から親に参照をしたい場合に belongs_to を使って、
親から子を参照したい場合に has_many を使えばよくて、必ず両方つけないといけないわけではないらしい。

今回は互いに参照したい(Company の下に Item を複数関連付ける)、このような Model クラスを定義する。

[code lang="ruby"]
class Company < ActiveRecord::Base
has_many :items, :dependent => :destroy
end

class Item < ActiveRecord::Base
belongs_to :company
end
[/code]

読み出すときは、

[code lang="ruby"]
<h1><%= link_to @company.name + 'のお菓子', @company.url%></h1>

<div id="container" class="row-fluid">
<% @company.items.each do |item| %>
<div class="thumbnail item">
<% end %>
</div>
[/code]

とか

[code lang="ruby"]
<%= link_to @item.company.name, @item.company %>
[/code]

とする。

っていうModel定義や読み出し方はよく記事になってたんだけど、データの生成の仕方についてはあまり情報が見つからなかった。

自分の場合は、親のModelを生成する時は通常の(関連を持たない)Modelを生成するのと同じように生成して、子のModelを生成する時に親から関連付けて生成するようにした。

[code lang="ruby"]
def create
....
@company = Company.find(item_params[:company_id])
@item = @company.items.build(item_params)
...
@item.save
...
end
[/code]

あと、一度作った Model にカラム追加する時は rake db:migrate するだけじゃなくて、strong parameters で許可するパラメータも増やすのを忘れないようにしたい。これで30分くらい悩んだorz