ruby-on-rails 使用ActiveStorage的多个数据库

r8uurelv  于 2023-03-09  发布在  Ruby
关注(0)|答案(2)|浏览(142)

我正在创建一个具有多个数据库的RoR应用程序。例如,我有两个数据库,分别名为:

  • Jmeter 板(包含所有用户条目、组表、承载表、公司表)
  • 商店(存放所有产品、目录......)

我设法通过创建两个database.yml文件并在Model中调用方法establish_connection来将这些模型存储在单独的数据库中。
我看到ActiveStorage有自己的模型“Blob & Attachment”,它们扩展了ActiveRecord::Base。为了存储条目,ActiveStorage运行位于model.rb文件中的has_one_attached()方法:
https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/attached/model.rb
如何在ActiveStorage引擎中操作此方法,以调用包含“establish_connection STORE_DB”的我自己的StoreBlob模型,而不是ActiveStorages Blob?

58wvjzkj

58wvjzkj1#

创建模型ActiveStorage::Blob和ActiveStorage::Attachment在您的应用程序与您的连接,在我的情况下是postgres.

class ActiveStorage::Attachment < PostgresModelBase

我在其他类PostgresModelBase中定义了连接
之后,您需要将模型中的所有内容从ActiveStorage Gem复制到新模型中。
希望奏效!!

798qvoo8

798qvoo82#

我所做的是将blob元数据存储在数据库B的MyModelB中名为blob_jsonjsonb列中
然后在数据库A中,在我的模型中,我将用途:

class MyModelA < ActiveRecord::Base
  has_one_attached :file, service: application_b_amazon # in storage.yml create this service so that it points to the bucket in Application B just in case it's different
end

class MyModelB <  ActiveRecord::Base
  establish_connection :database_b
end

最后我会做

my_model_a = MyModelA.create(title: '...')

my_model_b = MyModelB.find(1) # This would retrieve

# This would create a blob WITHOUT UPLOADING with the same key retrieved from the json. ==> It's a link/pointer
new_blob = ActiveStorage::Blob.create_before_direct_upload(JSON.parse(my_model_b.blob_json)

# Finally you attach the blob
my_model_a.attach(new_blob)

你也可以复制文件在自己的桶。但取决于你的需要,如果你导入,这可能会使事情变慢。
核心思想是,在服务/数据库B上,您将blob序列化为column。然后检索它,并使用指向服务B存储桶上的文件的相同密钥创建您自己的AS blob。
如果你想禁用purge,你可以覆盖这个模型上的purge方法(需要阅读activestorage源代码,以确保你禁用所有可能的方法,如果需要的话)对于我们自己的情况,我们没有这样做,因为它不重要。

相关问题