LoginSignup
0
0

More than 3 years have passed since last update.

【Rails】よっ!Active Strage!有能なGem!〜2つのテーブルから画像を保存できる〜

Last updated at Posted at 2021-01-10

ずっと謎だったこと

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を使えるようにする記述を行います。

app/models/user.rb
class User < ApplicationRecord

  has_one_attached :image  ⬅️これを記述

〜以下略〜

end

①ユーザーモデル
②レビュー投稿モデル
合計2つのモデルにhas_one_attached :imageを記述しました。

そしてマイグレーションファイルから画像保存用の記述を削除して、db:migrateをする。

結果

5d39289236b741ec2dcc8f2c4ed856eb.png

record_typeというカラムにUserPartyという2つの表示がされています。

大成功!(やっぱり会えたねActive Strage

気になったこと

ユーザーは複数枚の画像投稿(もしくは動画)が可能なように考えているのですが、もう1つテーブルを作ってそこにhas_many_attachedを使って保存されるのだろうか?
複数の場合はhas_oneからhas_manyに変わるとのことですがこのカラムを見ているとできそうな雰囲気も感じますが、実際にやってみた結果はまたこちらで記事を書こうと思います。

以上、Active Strageで2つのテーブルから画像を保存する方法でした。

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