动态更改 Rails 模型上的主动存储服务?

问题描述 投票:0回答:1

我使用 s3 的主动存储将文件附加到名为 Document 的模型。我需要添加对欧盟用户的支持,这些用户希望将其文档文件存储在欧盟的 s3 存储桶中。

我的 storage.yml 配置如下:

amazon:
    service: S3
    access_key_id: <%= ENV['S3_ACCESS_KEY_ID'] %>
    secret_access_key: <%= ENV['S3_SECRET_KEY_ACCESS'] %>
    region: <%= ENV['S3_REGION_EU'] %>
    bucket: <%= ENV['S3_BUCKET_NAME'] %>

amazon_eu:
    service: S3
    access_key_id: <%= ENV['S3_ACCESS_KEY_ID'] %>
    secret_access_key: <%= ENV['S3_SECRET_KEY_ACCESS'] %>
    region: <%= ENV['S3_REGION_EU'] %>
    bucket: <%= ENV['S3_BUCKET_NAME_EU'] %>

有没有办法根据Account中设置的区域动态切换Document模型中的服务?比如:

class Document < ApplicationRecord
  belongs_to :account
  
  if account.region == 'eu'
    has_one_attached :file, service: amazon_eu
  else
    has_one_attached :file, service: amazon
  end

end

或者真的指定我想在运行时动态使用的特定服务?

ruby-on-rails ruby amazon-s3 rails-activestorage
1个回答
0
投票

这可能不是您正在寻找的确切解决方案,但您可能需要考虑使用单表继承并定义一个单独的类:

class EUDocument < Document
  belongs_to :account
  has_one_attached :file, service: :amazon_eu
end

ActiveStorage 是围绕类级宏构建的,实际上没有任何记录的实例级重新配置功能。

虽然您可以进行疯狂的黑客攻击,例如使用

class_eval
或对宏生成的实例方法进行存根,但它会非常脆弱。

如果这是一个破坏因素,您可能需要考虑直接使用 S3 gem 来实现该功能,因为 ActiveStorage 是一个非常固执己见的设计,按照您需要的方式实现上传会更直接。

© www.soinside.com 2019 - 2024. All rights reserved.