Обратный вызов для загрузки файла Active Storage - PullRequest
0 голосов
/ 09 ноября 2018

Имеется ли обратный вызов для активных файлов хранения в модели

after_update или after_save вызывается при изменении поля в модели.Однако, когда вы обновляете (или, скорее, загружаете новый файл), кажется, что обратный вызов не вызывается?

context:

class Person < ApplicationRecord
  #name :string
  has_one_attached :id_document

  after_update :call_some_service

  def call_some_service
    #do something
  end
end

Когда загружается новый id_document after_update не вызываетсяоднако, когда name человека изменен, обратный вызов after_update выполняется

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Эмм, я бы просто прокомментировал, но так как это невозможно без представителя.

Ответ Uelb работает, но вам нужно исправить ошибку в комментариях и добавить ее в качестве инициализатора вместо модели. Например:

require 'active_storage/attachment'

class ActiveStorage::Attachment
  before_save :do_something

  def do_something
    puts 'yeah!'
  end
end
0 голосов
/ 04 декабря 2018

Ответ от @Uleb дал мне 90% пути, но для завершения я опубликую свое окончательное решение.

Проблема, с которой я столкнулся, заключалась в том, что я не смог обезопасить патч от класса (не уверен, почему даже требование класса согласно @ user10692737 не помогло)

Итак, я скопировал исходный код (https://github.com/rails/rails/blob/fc5dd0b85189811062c85520fd70de8389b55aeb/activestorage/app/models/active_storage/attachment.rb#L20)

и изменил его, чтобы включить обратный вызов

require "active_support/core_ext/module/delegation"

# Attachments associate records with blobs. Usually that's a one record-many blobs relationship,
# but it is possible to associate many different records with the same blob. If you're doing that,
# you'll want to declare with <tt>has_one/many_attached :thingy, dependent: false</tt>, so that destroying
# any one record won't destroy the blob as well. (Then you'll need to do your own garbage collecting, though).
class ActiveStorage::Attachment < ActiveRecord::Base
  self.table_name = "active_storage_attachments"

  belongs_to :record, polymorphic: true, touch: true
  belongs_to :blob, class_name: "ActiveStorage::Blob"

  delegate_missing_to :blob

  #CUSTOMIZED AT THE END:
  after_create_commit :analyze_blob_later, :identify_blob, :do_something

  # Synchronously purges the blob (deletes it from the configured service) and destroys the attachment.
  def purge
    blob.purge
    destroy
  end

  # Destroys the attachment and asynchronously purges the blob (deletes it from the configured service).
  def purge_later
    blob.purge_later
    destroy
  end


  private
    def identify_blob
      blob.identify
    end

    def analyze_blob_later
      blob.analyze_later unless blob.analyzed?
    end

    #CUSTOMIZED:
    def do_something

    end
end

Не уверен, что это лучший метод, и обновлю, если найду лучшее решение

0 голосов
/ 09 ноября 2018

На данный момент, похоже, что для этого случая обратного вызова нет.

Что вы можете сделать, это создать модель, которая будет обрабатывать создание активного вложения хранилища, которое создается при прикреплении файла к вашей модели человека.

Итак, создайте новую модель

class ActiveStorageAttachment < ActiveRecord::Base
  after_update :after_update

  private
  def after_update
    if record_type == 'Person'
      record.do_something
    end
  end
end

Обычно вы уже создали таблицу моделей в своей базе данных, поэтому нет необходимости в миграции, просто создайте эту модель

...