【実現したいこと】
1つの画面で、複数のテーブルを一括でDB(Postgres)に登録したいが、
1つのテーブルにしか登録されないので解決したいのですが、登録できない原因を考えても解決できなかったので、どのように実装したら解決できるのか、教えて頂けませんでしょうか。
(今後同じような質問を繰り返さないためにも、どのような思考過程を踏んだのかも合わせてご教示頂けますと幸いです)
【状況】
Rails:5.2.4.3
ruby:2.6.5
DB:postgres
Railsの学習から1ヶ月目(独学)
DB設計は下記の通り。
([]内には、今回DBに保存したいテーブルの属性を指す)
・Userテーブル(deviseでログイン機能実装)⇆Recordテーブル = [:training_date, :learning_point ]
※user_idで紐付け
・Recordテーブル ⇆ Outputテーブル = [:output_name]
・Recordテーブル ⇆ Practiceテーブル = [:practice_item, :practice_time]
・Recordテーブル ⇆ Taskテーブル = [:task_name]
※record_idで紐付け
schema.rb
ActiveRecord::Schema.define(version: 2020_05_25_064157) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" create_table "outputs", force: :cascade do |t| t.text "output_name" t.bigint "record_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["record_id"], name: "index_outputs_on_record_id" end create_table "practices", force: :cascade do |t| t.string "practice_item" t.integer "practice_time" t.bigint "record_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["record_id"], name: "index_practices_on_record_id" end create_table "records", force: :cascade do |t| t.string "user_id" t.text "learning_point" t.date "training_date" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "tasks", force: :cascade do |t| t.text "task_name" t.bigint "record_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["record_id"], name: "index_tasks_on_record_id" end create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end add_foreign_key "outputs", "records" add_foreign_key "practices", "records" add_foreign_key "tasks", "records" end
routes.rb
Rails.application.routes.draw do devise_for :users root to: 'records#index' resources :records # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end
Controller
class RecordsController < ApplicationController before_action :set_user def index @records = Record.all.order(created_at: 'desc') end def show @record = Record.find(params[:id]) end def new @record = Record.new output = @record.outputs.build practice = @record.practices.build task = @record.tasks.build end def create @record = Record.new(record_params) output = @record.outputs.build practice = @record.practices.build task = @record.tasks.build if @record.save redirect_to records_url, notice: "練習内容の登録が完了しました。" else flash[:alert] = "登録に失敗しました。" render :new end end def edit @records = Record.all end
index.htmnl.slim
※デザインはまだ実装していないです
h1 練習記録一覧 .container .row .col-sm-6 .form-group #datetimepicker4.input-group.date[data-target-input="nearest"] input.form-control.datetimepicker-input[type="text" data-target="#datetimepicker4"] .input-group-append[data-target="#datetimepicker4" data-toggle="datetimepicker"] .input-group-text i.fa.fa-calendar script[type="text/javascript"] | $(function () { $('#datetimepicker4').datetimepicker({ format: 'L' }); }); .d-flex .col-4.text-align: center = link_to '新規登録', new_record_path, class: 'btn btn-primary' .col-4.text-align: center = link_to 'リマインダー設定', new_record_path, class: 'btn btn-primary' .col-4.text-align: center = link_to 'レポートを見る', new_record_path, class: 'btn btn-primary' table thead tr th 練習日 tbody - @records.each do | record | tr td= link_to record.training_date, record td= link_to "編集", edit_record_path(record), class: 'btn btn-primary mr-3' td= link_to "削除", @record, method: :delete, data: { confirm: "本当に削除してもよろしいでしょうか?"}, class: 'btn btn-danger'
以上です。
もし他に必要な内容があれば、開示しますので、何卒よろしくお願い致します。
あなたの回答
tips
プレビュー