Как получить список атрибутов ActiveStorage (имен вложений)? - PullRequest
1 голос
/ 06 июня 2019

Например, у меня есть модель

class User < ApplicationRecord
  has_one_attached :avatar
  has_one_attached :diploma

  has_many_attached :photos
  has_many_attached :files
end

Как получить списки имен вложений для некоторой модели (отдельно для has_one_attached и has_many_attached)?

[:avatar, :diploma] и [:photos, :files] в этом случае.

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Я не знаю, есть ли прямой способ, но это обходной путь (для уже сохраненных записей):

ActiveStorage::Attachment.distinct.pluck(:record_type).map(&:underscore)


Начиная с модели, это необработанная идеяуточнено:
User.reflect_on_all_associations(:has_many).map { |e| e.name.to_s.split("_") }.select { |e| e.last == "attachments" }
User.reflect_on_all_associations(:has_one).map { |e| e.name.to_s.split("_") }.select { |e| e.last == "attachment" }

Примечание == "attachments" и == "attachment"

0 голосов
/ 08 июня 2019

@ iGian дал отличную идею, но в этом есть проблема.

Если имя вложения содержит подчеркивание (я), это приведет к неверному результату.

Итак, мое решение:

  • для has_many_attached
User.
  reflect_on_all_associations(:has_many).
  map { |reflection| reflection.name.to_s }.
  select { |name| name.match?(/_attachments/) }.
  map { |name| name.chomp('_attachments').to_sym }

#=> [:photos, :files]
  • для has_one_attached
User.
  reflect_on_all_associations(:has_one).
  map { |reflection| reflection.name.to_s }.
  select { |name| name.match?(/_attachment/) }.
  map { |name| name.chomp('_attachment').to_sym }

#=> [:avatar, :diploma]
...