ActiveStorage 同じblobを複数のレコードで使いまわす

Rails 6.0.0.rc1

class Doc < ApplicationRecor
  belongs_to :user
  has_one_attached :file
end

例えばこういうモデルがあったときに、fileを他のuserと共有したいといった場合、 まっさきに思いつくのは中間テーブルを作ってUserとDocを多対多にしてしまう方法かもしれないが、 それだと共有されているuserのうち誰かがDocのnameなどを変更すると共有されているUser全員の手元のDocの名前が変更される。

仕様的に正しい場合はそれで構わないが、例えば「共有」ではなく「送付」だったりすると、送付した相手が加えた変更が送信元にも影響を及ぼすのは嬉しくない。

そんな場合は以下のように新しいDoc側で対象のblobを引数にActiveStorage::Attachment#attachを呼ぶとblobを共有できる

doc = Doc.first

copied = Doc.create(
  name: doc.name
)
copied.file.attach(doc.file.blob)