以前の続き
ふわっとやりたかったことが形になったので頑張って言語化
開発環境
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 を許容
