そろそろ開発25 railsでコメント機能 1対多のmodel関係(同時更新編)
1.皆様、ブログは書きますか?
私はたまにしか書きませんw
今回はブログの「記事とコメント」のような、1対多、1:n、親子の関連を持つテーブルをまとめて更新する場合の実装について紹介します。
2.modelに親子関係を追記するが...
これは釈然としないのだが、Railsで2つのmodelを親子関係にする場合、伝統的に「belongs_to 親」「has_many 子(複数形)」の定義をmodel名.rbに追記する。
これで親のshowメソッドで、暗黙的に子も検索できる。ブログのようにコメントをつける事も出来る。一安心...ではない。
Titleという親に、Papersという子をつけ、1つの親の3つの子がぶら下がっている。
これを親子同時に更新することを目指し、Editをする。
titleの_form.html.erb
<%= f.input :user_name %>
<%= f.input :title %>
<%= f.input :subtitle %>
<%= f.fields_for :papers do |paper| %>
<%= paper.input :memo %>
<%= paper.input :body %>
<% end %>
<div class="form-actions">
<%= f.button :submit, :class => 'btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
titles_path, :class => 'btn' %>
</div>
<% end %>
titleのcontroller.editメソッド
def edit
@title = Title.find(params[:id])
end
あれ?1対3の子データが出ないぞ....
3.親modelに「子をネストする」とわざわざ書かねばならない
Titleのmodel
class Title < ActiveRecord::Base
has_many :papers
accepts_nested_attributes_for :papers
end
このように親が、子をネストするぞ、と書かなければならない。以外と細かい。
おー、3つの子データが出た。Update Titleボタンを押すと、3つの子は、変更されていれば、UPDATEクエリを発行する。省エネ。