0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

user モデルが作成されたときに孫モデルまでビルド

Posted at

以前の続き

ふわっとやりたかったことが形になったので頑張って言語化

開発環境

ruby 2.6.5
Ruby on Rails 5.2.5

やりたかったこと

user モデルが作成されたときに
user モデルに紐づく ranking モデルと
その子モデルの ranking_item モデルまで build する

こうすることで以下みたいになる
Image from Gyazo

テーブルをプロフィールとランキングとで分けることで
ユーザーとしては それぞれを独立した形で変更できる。

さらに神社ランキングにユニークなランキングアイテムをビルドしているので
神社ランキングっていう枠組みの中で神社ランキングアイテムを編集することになる。

要するに、1位の神社は1位の神社として編集ができる。

また、ユーザーの作成時にこれらをビルドしているので、
new アクションと create アクションが必要ない。

つまり、プロフィールやランキングを作成するっていう作業がなくなり
ユーザーとしてはそれぞれを編集するっていう作業がスタートになる

これをするにあたって前回に引き続き devise の設定をさわったので
以下コードの抜粋

registrations_controller.rb
  def create
    super
    a = resource.rankings.build(rank: 1)
    a.ranking_items.build.save
    b = resource.rankings.build(rank: 2)
    b.ranking_items.build.save
    c = resource.rankings.build(rank: 3)
    c.ranking_items.build.save
    resource.build_user_introduction
    resource.save
  end

resource に登録したユーザーが入っているので
ユーザーから rankings をビルドし
rankings から ranking_items をビルドしている

こうすることでユーザーの作成時に
前回の user_introduction 含め 関連モデルを一気に生成できる

また、実は ranking_items には神社の外部キーが入るので
あらかじめ build する形だとエラーになってしまう

なので

ranking_item.rb

belongs_to :shinto, optional: true

optional: true をつけることでビルド時の null を許容

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?