QA@IT

「rails」複数のテーブルを同時に更新する方法

4179 PV

初めまして。
私は現在、同時に2つのテーブルにsaveをする方法がわからなくて困っています。
皆様の知恵をお借りできたら幸いです。

やりたい事としては、日報を提出する際に、今月の自分の今日の結果を入力して、
日報の本文にその内容を今日の結果、今月の目標、今月の売り上げ結果をのせるようにしたいです。
理由としては、売り上げ結果を入力しない人がいて、どうしたら、入力してくれるかと考えたときに日報は、絶対に書かなければいけないため、そこで一緒に入力できるようにすればいいと思ったからです。

テーブルの構成としては、以下の通りです。
user_targets(個人売り上げ) 1 ← 多 users(スタッフ) 1 → 多reports(日報)

テーブルのカラムは
user_targets
user_id,day_at,kind,target(今日の売り上げ目標),answer(今日の売り上げ結果)
reports
user_id,write_day(日報を記載した日),title,body

viewでは
<%= form_for(@report,html: {class: "form-horizontal", role: "form" }) do |f| %>
でreportのcreateにpostしています。
postされたときに今日の売り上げ結果をuser_targetsのanswerに、本文(body)をreportにsaveされるようにしたいです。
どうかお力をお貸しください。

回答

http://guides.rubyonrails.org/form_helpers.html#building-complex-forms
ここの説明が参考になると思います。

Person has_many Addressの関係が成り立つとき、まず親側のPesronを以下のようにします。

class Person < ActiveRecord::Base
  has_many :addresses
  accepts_nested_attributes_for :addresses
end

こうするとPersonモデルにaddresses_attributes=というメソッドが使えるようになり、Personと関連するAdressesを同時に更新できるようになります。ビューの中ではfields_forを使うと、関連するAddress側のフォームを作り、受け取ることができるようになります。

<%= form_for @person do |f| %>
  Addresses:
  <ul>
    <%= f.fields_for :addresses do |addresses_form| %>
      <li>
        <%= addresses_form.label :kind %>
        <%= addresses_form.text_field :kind %>

        <%= addresses_form.label :street %>
        <%= addresses_form.text_field :street %>
        ...
      </li>
    <% end %>
  </ul>
<% end %>

今回のケースですと、Userが親で、UserTargetとReportが子のようですので、同じように設定してform_for @userにして、関連するデータを取得、更新すればいいのではないでしょうか?

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。