7
6

More than 3 years have passed since last update.

複数のテーブルに一度の入力で保存する方法

Last updated at Posted at 2020-09-05

【概要】

1.結論

2.Formオブジェクトとは

3.使用方法

4.ここから学んだこと

1.結論

Formオブジェクトを使う!


2.Formオブジェクトとは

複数のテーブルに1度に保存できる方法です!
本来であれば保存したいテーブル分のコントローラー、モデルmigrateファイルを作らなければなりません。この場合ですと、モデルとある一つのファイルをつくるだけで簡単にできます!


3.使用方法

❶appにformオブジェクト専用のフォルダとその中にファイルをつくります。そして以下のように記述します。今回は購入された情報と住所をDBに反映させたいのでsellitem_addressにします!

app/forms/sell_item_address.rb
class SellitemAddress

 include ActiveModel::Model
 attr_accessor :postal_code, :shipping_orig_id, :city, :address_other, :building_name, 
               :telephone_num, :sell_item_id, :user_id, :buy_item_id

end

:user_idは新規登録したユーザー、
:buy_item_idは売られている商品になります。

include ActiveModel::Modelを記載しincludeすることで、モデルのように扱えてここにバリデーションの記載もできます!

attr_accessorはメソッド内の記述をメソッド外の時に変更を加えれるようにできるメソッドです!つまりインスタンス変数として扱えるようになり、ゲッターとセッターの内部処理を行っています!

❷使用したいモデルに対して情報を記載します。

app/forms/sellitem_address.rb
 def save
    sell_item = SellItem.create(user_id: user_id, buy_item_id: buy_item_id)
    Address.create(postal_code: postal_code, shipping_orig_id: shipping_orig_id, city: city, address_other: address_other, building_name: building_name,telephone_num: telephone_num, sell_item_id: sell_item.id )
  end

このようにすることでDBに保存できるカラムの設定を行いました!
user_id buy_item_idとなっているのは
既にuserのidとbuy_itemのidを設定しているのでidごとそのまま抜き取りたい設定をしています!

❸ビューで入力した情報をコントローラーがDBに登録できるように指示を出すように設定します。

sell_items_controller
def create
    @sell_item = SellitemAddress.new(sell_item_params)
    if @sell_item.save
      return redirect_to root_path
    else
      render 'sell_items/index'
    end

  private

  def sell_item_params
    params.permit(:postal_code, :shipping_orig_id, :city, :address_other, :building_name, :telephone_num, :user_id, :buy_item_id).merge(user_id: current_user.id)
  end
 end

sell_item_paramsメソッドの中では、モデルで設定した情報を記載し、それを保存する際にsell_item_paramsとしてまとめています。こうすることで各カラムがどのテーブルに保存されるかを判断してくれるので非常に便利です!
読み込む記述も少なくなるので動作に負荷を与えずに済みます!


4.ここから学んだこと

本来であれば、コントローラーとモデルとmigrateファイルを保存したいテーブル分作り、viewと連携させて行います。また各コントローラーと連携するのか、各入力部分において各コントローラーに指示ださないといけないです。拡張性の部分でもエラーが発生する可能性は大いにあります。この方法なら保守性・可読性が上がり、各コントローラーに指示を出すより動作に負荷を与えずに済みます!


7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6