Rails:如何禁用 ActiveStorage 分析器和预览器

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

我有一个使用 ActiveStorage 的 Rails 5.2.3 应用程序。默认情况下,ActiveStorage 将运行一些后台作业以从附加文件中提取元数据,和/或创建缩略图以进行预览。

我不想这样。我不需要任何元数据,也不需要任何缩略图。那么我怎样才能禁用这些后台作业呢?

根据官方Rails指南,我已经设置了

config.active_storage.analyzers = []
config.active_storage.previewers = []

/config/application.rb

但是,看起来并没有什么帮助。跑步时

rails test
,我仍然看到

[ActiveJob] [ActiveStorage::AnalyzeJob] Performing ActiveStorage::AnalyzeJob (Job ID: 741592f5-c5e4-48d7-8cf9-158790fb8a00) from Inline(default) with arguments: #<GlobalID:0x00005642f9050748 @uri=#<URI::GID >>
[ActiveJob] [ActiveStorage::AnalyzeJob] (22.0ms)  SAVEPOINT active_record_1
[ActiveJob] [ActiveStorage::AnalyzeJob] ActiveStorage::Blob Update (22.7ms)  UPDATE `active_storage_blobs` SET `metadata` = '{\"identified\":true,\"analyzed\":true}' WHERE `active_storage_blobs`.`id` = 3056
[ActiveJob] [ActiveStorage::AnalyzeJob] (21.9ms)  RELEASE SAVEPOINT active_record_1   

我也尝试过通过初始化文件:

# /config/initializers/active_storage_disable_analyze.rb
Rails.application.config.active_storage.analyzers.delete ActiveStorage::Analyzer::ImageAnalyzer
Rails.application.config.active_storage.analyzers.delete ActiveStorage::Analyzer::VideoAnalyzer

但这也无济于事。

ruby-on-rails rails-activestorage
5个回答
5
投票

我根本不想或不需要任何分析,并且重写模块方法似乎可以解决问题。

ActiveStorage::Blob::Analyzable.module_eval do

  def analyze_later
  end

  def analyzed?
    true
  end
end

还很早,所以我不能保证没有副作用,但到目前为止一切都很好,在我的 sidekiq 日志中不再看到任何 ActiveStorage::AnalyzeJob 条目,并且 blob 似乎完全可用,下载链接有效等。


2
投票

没有简单的方法可以完全禁用分析器。当您删除图像/视频分析器时,Rails 会回退到 NullAnalyzer,它不会收集任何元数据。

您可以在此处查看默认位置


2
投票

配置/初始化程序/override_as_blob.rb

Rails.application.config.to_prepare do
  ActiveStorage::Blob.class_eval do
    def analyzed?
    # Do whatever override
      if checksum.blank?
        true
      else
        super
      end
    end
  end
end

2
投票

我更喜欢通过删除自动呼叫来实现清晰的方式。

Rails.application.config.to_prepare do
  ActiveStorage::Attachment.skip_callback(:commit, :after, :analyze_blob_later)
end

0
投票

您可以全局删除分析器,这最终只会运行

NullAnalyzer

ActiveStorage.analyzers = []

对于更具选择性的内容,您可以将它们包装在覆盖其

.accept?(blob)
的子类中。

例如,我们使用自定义的ActiveStorage服务类来加密一些上传,但它不支持

ActiveStorage::AnalyzeJob
使用的流式下载。我们仅以这种方式禁用使用该服务的附件的分析:

ActiveStorage.analyzers.map! do |klass|
  Class.new(klass) do
    def self.accept?(blob)
      return false if blob.service.is_a?(EncryptedS3Service)
      super
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.