以前の続き
ふわっとやりたかったことが形になったので頑張って言語化
開発環境
ruby 2.6.5
Ruby on Rails 5.2.5
やりたかったこと
user
モデルが作成されたときに
user
モデルに紐づく ranking
モデルと
その子モデルの ranking_item
モデルまで build
する
テーブルをプロフィールとランキングとで分けることで
ユーザーとしては それぞれを独立した形で変更できる。
さらに神社ランキングにユニークなランキングアイテムをビルドしているので
神社ランキングっていう枠組みの中で神社ランキングアイテムを編集することになる。
要するに、1位の神社は1位の神社として編集ができる。
また、ユーザーの作成時にこれらをビルドしているので、
new
アクションと create
アクションが必要ない。
つまり、プロフィールやランキングを作成するっていう作業がなくなり
ユーザーとしてはそれぞれを編集するっていう作業がスタートになる
これをするにあたって前回に引き続き devise
の設定をさわったので
以下コードの抜粋
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
を許容