ruby-on-rails 主动存储Map如何工作?

fruv7luv  于 2023-04-22  发布在  Ruby
关注(0)|答案(1)|浏览(119)

我面对的是一个ruby on rails应用程序,它使用活动存储作为文件管理器。
现在我想把这些文件迁移到一个azureblob存储,为此我需要把数据库条目从一个活动存储Map到我们自己的存储表。
活动存储的文件夹结构如下所示:

和相关的数据库表如下所示:

我找不到一种方法来匹配存储器上的文件和数据库的条目。无论是文件名还是键都没有给我任何关于如何Map它们的想法。
我是否遗漏了什么?如何根据数据库条目获取相关的活动存储文件?
我试图在数据库文件名或键值与活动存储文件夹结构之间找到匹配项,但没有成功。

lyr7nygr

lyr7nygr1#

说我们有模特

class MyFirstModel < ApplicationRecord
  has_one_attached :my_attachment
end

我们决定在第一篇文章中附上一些文件

MyFirstModel.first.my_attachment.attach(io: File.open("/path/to/my_first.file"), filename: "my_first.file")

现在我们来检查一下

blob = ActiveStorage::Blob.last

blob.key
# => "7zs2snslr8ehnhlcz0c7dzz96k98"

blob.filename.to_s
# => "my_first.file"

我们就能找到这个文件

active_storage_config = Rails.configuration.active_storage
storage_root_dir = active_storage_config.service_configurations[active_storage_config.service.to_s]["root"]

Dir[File.join(storage_root_dir, "**", "*", blob.key)]
# => ["/path_to_app/storage/7z/s2/7zs2snslr8ehnhlcz0c7dzz96k98"]

你可以定义一些方法

def find_filepath_by_blob(blob)
  active_storage_config = Rails.configuration.active_storage
  storage_root_dir = active_storage_config.service_configurations[active_storage_config.service.to_s]["root"]

  Dir[File.join(storage_root_dir, "**", "*", blob.key)].first
end

这样我们就能找到所有的文件

ActiveStorage::Attachment.includes(:blob).find_each do |attachment|
  blob = attachment.blob

  puts <<~INFO
    Attachment ID: #{attachment.id}
    Attachment model: #{attachment.record_type}
    Attachment model ID: #{attachment.record_id}
    Filepath: #{find_filepath_by_blob(blob)}
    Filename: #{blob.filename}

  INFO
end

# will print
#
# Attachment ID: 1
# Attachment model: MyFirstModel
# Attachment model ID: 1
# Filepath: /path_to_app/storage/7z/s2/7zs2snslr8ehnhlcz0c7dzz96k98
# Filename: my_first.file
#
# Attachment ID: 3
# Attachment model: MyOtherModel
# Attachment model ID: 22
# Filepath: /path_to_app/storage/sv/yb/svybg3pr5kme2uxzkiupjqykxrr5
# Filename: some.file

当然,你可以做你想要的,而不是打印这些信息。例如上传到一些云

相关问题