ずっと謎だったこと
Active Strageで画像を保存する時に二つのテーブルから保存できるのか?ということがずっと疑問でした。
現在オリジナルアプリを開発中なのですがレビューサイトのため、
①ユーザーのプロフ写真
②レビュー対象の写真
この二つを保存したかったのですが複数のテーブルから保存する方法がいまいちよくわからなかったため、ユーザーのほうはtext型にて保存、Active Strageを使用するのはレビュー対象のみとしていました。
本日、マイグレーションをrollbackしなければいけないミスがあり、ついでだからやってみようと思い立ち、以下の作業をしました。
・ユーザーテーブルに保存していた画像保存予定だったカラムを消去
・ユーザー登録時&レビュー対象登録時にそれぞれ写真が保存できるか確認
まずはマイグレーションを編集します。
% rails db:rollback
このコマンド、最初は実行するのがとてもとても怖かったです(初心者あるある
その後、状況がどうなっているかをしっかり確認するためステータスをチェック。
% rails db:migrate:status
database: party_freak_development
Status Migration ID Migration Name
--------------------------------------------------
up 20210107124355 Devise create users ⬅️変更目標はここ
up 20210108071047 Create parties
up 20210108094951 Create active storage tablesactive storage
up 20210108122152 Rename iintroduction column to parties ⬅️リネームした履歴
up 20210108123328 Rename date id column to parties ⬅️リネームした履歴
down 20210108130921 Change column to allow null ⬅️null制約変更した履歴
下の3つは昨日変更したテーブルのカラムの名前とnull制約に関するマイグレーションファイルです。
よくよく考えたらリネームしてマイグレーションファイルを増やすならrollbackしてマイグレーションファイルを直に修正したほうが余計なファイルが増えなくていいんじゃないか?
と気付き、rollbackを繰り返し行って下の3つのマイグレーションファイルをコードエディタ上から右クリック→削除しました。スッキリ。
繰り返す時はこのコマンドが便利です。
% rails db:rollback STEP=5
⬆️=の後にdownを0とし(次のupから1と数える)その回数だけrollback
今回の自分のケースだと5でした
よく見たら一瞬焦ったこと
== 20210108094951 CreateActiveStorageTables: reverting ========================
-- drop_table(:active_storage_attachments, {})
-> 0.0470s
-- drop_table(:active_storage_blobs, {})
-> 0.0363s
== 20210108094951 CreateActiveStorageTables: reverted (0.0847s) ===============
Active Strageがdropになってるううううううううううううう!
またやらかしたああああああああああああああああ!
一瞬焦ったがdb:migrate
で、きっとまた会えるよね?そう信じて次に進む。
ユーザーモデルにActive Strageを使えるようにする記述を行います。
class User < ApplicationRecord
has_one_attached :image ⬅️これを記述
〜以下略〜
end
①ユーザーモデル
②レビュー投稿モデル
合計2つのモデルにhas_one_attached :image
を記述しました。
そしてマイグレーションファイルから画像保存用の記述を削除して、db:migrateをする。
結果
record_typeというカラムにUserとPartyという2つの表示がされています。
大成功!(やっぱり会えたねActive Strage
気になったこと
ユーザーは複数枚の画像投稿(もしくは動画)が可能なように考えているのですが、もう1つテーブルを作ってそこにhas_many_attached
を使って保存されるのだろうか?
複数の場合はhas_one
からhas_many
に変わるとのことですがこのカラムを見ているとできそうな雰囲気も感じますが、実際にやってみた結果はまたこちらで記事を書こうと思います。
以上、Active Strageで2つのテーブルから画像を保存する方法でした。