例如我有模型
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]
。
答案 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)