a big fish in a small pond

ロードバイク、rails 、料理、写真、ガシェットでお送りします。

そろそろ開発25 railsでコメント機能 1対多のmodel関係(同時更新編)

f:id:yoshidaagri:20140215173104j:plain

1.皆様、ブログは書きますか?

私はたまにしか書きませんw

今回はブログの「記事とコメント」のような、1対多、1:n、親子の関連を持つテーブルをまとめて更新する場合の実装について紹介します。

 

2.modelに親子関係を追記するが...

 

これは釈然としないのだが、Railsで2つのmodelを親子関係にする場合、伝統的に「belongs_to 親」「has_many 子(複数形)」の定義をmodel名.rbに追記する。

これで親のshowメソッドで、暗黙的に子も検索できる。ブログのようにコメントをつける事も出来る。一安心...ではない。

f:id:yoshidaagri:20140216215935p:plain

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

f:id:yoshidaagri:20140216220444p:plain

あれ?1対3の子データが出ないぞ....

 

3.親modelに「子をネストする」とわざわざ書かねばならない

Titleのmodel

class Title < ActiveRecord::Base

  has_many :papers

  accepts_nested_attributes_for :papers

 

end

このように親が、子をネストするぞ、と書かなければならない。以外と細かい。

f:id:yoshidaagri:20140216220701p:plain

おー、3つの子データが出た。Update Titleボタンを押すと、3つの子は、変更されていれば、UPDATEクエリを発行する。省エネ。