2017-08-26 2 views
0

J'imagine quelque chose de similaire à ceci:Rails: Champ d'application d'un modèle ensemble

class User < ApplicationRecord 

    default_scope -> { where(public: true) } 

end 

Maintenant, chaque fois que le modèle utilisateur est accessible, il doit toujours ajouter where(public: true) à querys. Donc all finirait par être all.where(public: true). J'essaye de mettre quelque chose comme ceci dans la classe ApplicationRecord pour surcharger le comportement sur tous les modèles héritants, ainsi le remplacement manuel n'est pas une option pour moi.

+0

Est-ce que 'default_scope' sera le même pour tous héritant des modèles? – Pavan

+0

@Pavan oui. C'est pourquoi je veux hériter :-) – jonhue

Répondre

1

Si le default_scope reste identique pour tous les modèles héritant, alors vous pouvez envisager de mettre que dans un modèle personnalisé et que tous les autres modèles héritant de ce modèle

class CustomModel < ApplicationRecord 
    default_scope -> { where(public: true) } 
end 

Et que d'autres modèles héritent de ce modèle personnalisé comme si

class A < CustomModel 
end 
+0

et 'default_scope' fonctionne? – jonhue

+1

@jonhue AFAIK ça devrait marcher. Essayez-le :) – Pavan

+0

Je ne connaissais pas la présence de 'default_scope', mais il semble que mon instinct était juste :) – jonhue

0

Si tous vos modèles ont public comme une propriété, vous pouvez ajouter le default_scope sur tous les modèles en l'ajoutant à app/models/application_record.rb;

Cependant, ayant une default_scope de where(public: true) est un peu difficile ici parce que vous ne serez pas en mesure d'accéder aux données not_public données, sauf si vous utilisez la méthode unscoped: User.unscoped.

Cela étant dit, il est préférable si vous ajoutez un champ scope :public, ->() { where(public: true) } et appelez chaque fois que vous voulez vous assurer que votre utilisateur public:

User.public.find_by(email: 'xxxxx')

+1

Je connais les avantages et les 'risques' de l'utilisation de default_scope et je ne l'utilise pas pour l'exemple I l'a illustré dans le post. Je l'utilise pour un gem -> https://github.com/slooob/sandboxy Cependant, j'ai fini par faire quelque chose de similaire à l'ajouter à application_record en le liant à la méthode 'sandboxy' fournie par la gemme. La gemme exige qu'aucune portée supplémentaire ne soit nécessaire pour que cela fonctionne comme prévu. – jonhue