我使用 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
或者真的指定我想在运行时动态使用的特定服务?
这可能不是您正在寻找的确切解决方案,但您可能需要考虑使用单表继承并定义一个单独的类:
class EUDocument < Document
belongs_to :account
has_one_attached :file, service: :amazon_eu
end
ActiveStorage 是围绕类级宏构建的,实际上没有任何记录的实例级重新配置功能。
虽然您可以进行疯狂的黑客攻击,例如使用
class_eval
或对宏生成的实例方法进行存根,但它会非常脆弱。
如果这是一个破坏因素,您可能需要考虑直接使用 S3 gem 来实现该功能,因为 ActiveStorage 是一个非常固执己见的设计,按照您需要的方式实现上传会更直接。