如何将 has_one_attached 转换为 has_many_attached 到带有 has_one 附件的现有表?

gra*_*i33 3 activerecord ruby-on-rails rails-migrations rails-activestorage

我有一个Message模型

  class Message < ApplicationRecord
    has_one_attached :attachment
Run Code Online (Sandbox Code Playgroud)

但现在我需要将其转换为:

  class Message < ApplicationRecord
    has_many_attached :attachments
Run Code Online (Sandbox Code Playgroud)

为消息启用多个附件所以我在模型中更改has_one_attachedhas_many_attachedMessage

但当我运行时message.attachments.attached?它会返回false到现有附件。它适用于新附加的文件。

我应该添加迁移还是rake手动添加/转换附件的一次性任务?

这样做的正确方法是什么?

Dan*_*ean 10

返回 false的原因message.attachments.attached?是因为您将属性名称从 更改attachmentattachments。ActiveStorage 将该属性名称保存在数据库中,因此如果该名称在代码中发生更改,它就无法再找到旧的附件。

因此,要么不更改属性名称(最简单的解决方案),要么创建这样的数据迁移

    ActiveStorage::Attachment.where(name: "attachment")
                             .where(record_type: "Message")
                             .update(name: "attachments")
Run Code Online (Sandbox Code Playgroud)