如何获取ActiveStorage属性(附件名称)列表?

时间:2019-06-06 20:21:47

标签: ruby-on-rails rails-activestorage

例如我有模型

class User < ApplicationRecord
  has_one_attached :avatar
  has_one_attached :diploma

  has_many_attached :photos
  has_many_attached :files
end

如何获取某些模型的附件名称列表(分别用于has_one_attachedhas_many_attached)?

[:avatar, :diploma][:photos, :files]

3 个答案:

答案 0 :(得分:2)

我不知道是否有直接的方法,请解决此问题(对于已存储的记录):

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"

答案 1 :(得分:0)

@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]

答案 2 :(得分:0)

一种不依赖命名约定的解决方案,它将基于Rails自己的内部结构为您提供所需的确切信息:

  • 用于has_one_attached
User
  .reflect_on_all_attachments
  .filter { |association| association.instance_of? ActiveStorage::Reflection::HasOneAttachedReflection }
  .map(&:name)
  • 用于has_many_attached
User
  .reflect_on_all_attachments
  .filter { |association| association.instance_of? ActiveStorage::Reflection::HasManyAttachedReflection }
  .map(&:name)