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é?
3 Réponses :
Vous pouvez utiliser 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.
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.
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
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 >