【问题标题】:How to get list of ActiveStorage attributes (attachment names)?如何获取 ActiveStorage 属性列表(附件名称)?
【发布时间】:2019-06-06 20:21:47
【问题描述】:

例如我有模型

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] 在这种情况下。

【问题讨论】:

  • 所以给定一个任意模型类M,您想知道Mhas_one_attachedhas_many_attached 名称吗?
  • @muistooshort,是的。分别用于has_one_attachedhas_many_attached

标签: ruby-on-rails rails-activestorage


【解决方案1】:

一种不依赖于命名约定的解决方案,它将根据 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)

【讨论】:

    【解决方案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"

    【讨论】:

    • 谢谢,它也很有帮助。但不幸的是,我需要通用列表,而不仅仅是存储记录
    • @mechnicov,请检查我的编辑是否给您提示
    • 好提示!但不需要使用split('_'),因为名称可以包含_。类似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 }
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多