Как я могу проверить, действительно ли присутствует большой двоичный объект ActiveStorage? - PullRequest
0 голосов
/ 07 мая 2020

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

Azure::Core::Http::HTTPError: BlobNotFound (404): The specified blob does not exist.

Я могу легко воссоздать этот большой двоичный объект, но эта ситуация заставляет меня написать сценарий для проверки целостность всех моих вложений и убедиться, что все остальные не пропали. (Я ожидаю, что это временная сетевая ошибка, и я ожидаю найти очень мало, но мне нужно спокойствие.)

Я вижу, что есть метод вызова, который, кажется, делает именно то, что Мне нужно: exist?(key), что описано здесь:

https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/service/disk_service.rb

Однако я не могу понять, как я должен это называть. Согласно this , он реализован как метод экземпляра. Итак, как мне сослаться на активный экземпляр ActiveStorage моего приложения Rails (в зависимости от среды), чтобы использовать этот метод?

1 Ответ

0 голосов
/ 11 мая 2020

Я подумал, можно ли вернуться назад, чтобы получить экземпляр ActiveStorage :: Service :: AzureStorageService (в производстве), и нашел этот ответ при обнаружении каждого экземпляра класса. 1004 * Отсюда я обнаружил, что могу:

asass = ObjectSpace.each_object(ActiveStorage::Service::AzureStorageService).first

Что затем позволило мне:

2.5.5 :015 > asass.exist?(c.json.blob.key)
  AzureStorage Storage (313.3ms) Checked if file exists at key: ....PTLWNbEFLgeB8Y5x.... (yes)
 => true

Дальнейшее копание в недрах GitHub Rails привело меня к что ссылка на экземпляр службы ActiveStorage может быть достигнута через экземпляр сохраненного объекта, и что я всегда могу использовать метод send() для вызова одного из его методов:

2.5.5 :045 > c.json.blob.service.send(:exist?, c.json.blob.key)
  AzureStorage Storage (372.4ms) Checked if file exists at key: ....PTLWNbEFLgeB8Y5x.... (yes)
    => true

Я уверен, что оба подхода освещают одни и те же пути кода, но я не уверен, какой из них я предпочитаю в данный момент. Я все еще думаю, что должен существовать какой-то способ пройти через экземпляр Rails через app. или Rails.application., чтобы добраться до экземпляра ActiveStorage, но я не смог разобраться в этом.

...