2
votes

Comment déterminer l'association de stockage active?

J'ai un formulaire de téléchargement pour tous les modèles utilisant des pièces jointes de stockage actives. Les fonctionnalités de ce formulaire peuvent changer selon que l'uploader est un has_one_attached ou has_many_attached. Existe-t-il un moyen de déterminer le type d'association d'un modèle donné?


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser reflect_on_all_associations:

https : //api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-reflect_on_all_associations

Model.reflect_on_all_associations(:has_one_attached)

Je n'ai pas essayé mais Je suppose:

Account.reflect_on_all_associations   # returns an array of all associations
Account.reflect_on_all_associations(:has_many)  # returns an array of all has_many associations

Contiendra un enregistrement si le modèle: has_one_attached, et sera vide dans le cas contraire.


4 commentaires

Reflect_on_all_associations n'inclut pas les pièces jointes. Cependant, les rails ont deux autres méthodes "reflect_on_all_attachments" et "reflect_on_attachment". Ils renvoient tous les deux un objet ActiveStorage :: Reflection .... à partir duquel je ne sais pas comment déterminer si cette réflexion est un has_one ou un has_many.


Je pourrais faire quelque chose comme Document.reflect_on_attachment (: attachments) .name.ends_in? ('‌ s'). Mais cela semble terriblement fragile.


Ce serait assez moche mais vous pourriez vérifier si l'association renvoyée est au singulier ou au pluriel


FWIW J'ai essayé Model.reflect_on_all_associations (: has_one_attached) et cela ne semble pas fonctionner.



0
votes

Je n'aime pas cette approche, mais cela fonctionne. Tous mes modèles n'ont qu'une seule association d'attachement. Si un modèle avait plus d'une association d'attachement, cela se romprait. Je vais continuer à affiner ceci.

def can_have_many_attachments?
  uploader_name.present? &&
    uploader_name.ends_with?('s')
end

def uploader_name
  self.class.reflect_on_all_attachments.last.name.to_s
end


0 commentaires

0
votes

Ce qui suit semble fonctionner, au moins pour Active Storage.

ModelName.reflect_on_all_associations.select { |a|
  a.class_name == 'ActiveStorage::Attachment'
}.map(&:name)

Et si vous ne voulez que les noms d'attributs:

ModelName.reflect_on_all_associations.select { |a|
  a.class_name == 'ActiveStorage::Attachment'
}

p >


0 commentaires