2017-05-29 4 views
0

Si je ne veux que renvoyer des propositions publiées mais non expirées, est-ce possible avec Pundit?Pundit scope published or non périmé date condition

Jusqu'à présent, j'ai ceci:

class ProposalPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     if @user.admin? 
     scope.all 
     else 
     scope.where(published: true) 
     end 
    end 
    end 

    ... 

end 

Un travail autour d'écrire du code supplémentaire dans l'action index de mon contrôleur de proposition pour filtrer davantage la liste des instances de propositions vers le bas à des propositions non périmés.

J'espère que il y a une syntaxe magique comme ceci:

scope.where({published: true, expire_date > Time.now }) 

Toutes les idées? : D

Répondre

1

Vous pouvez le faire en une seule commande where:

scope.where('published = ? AND expire_date > ?', true, Time.now) 

Ou, scindée en deux:

scope.where(published: true) 
    .where('expire_date > ?', Time.now) 

Quant à l'endroit où cette logique devrait aller, c'est à vous de décider.

Si c'est vraiment une restriction de la politique(à savoir que les administrateurs sont autorisés de voir les propositions expirés/non publiées), puis le mettre dans le champ d'application de Pundit.

D'autre part, si les non-admins sont juste d'être présentés une liste filtrée pour la commodité (mais peut voir encore des propositions expirés/non publiés par d'autres moyens), je préfère mettre cette requête dans le contrôleur .

+0

Oui, semble que je n'ai pas assez google assez, j'ai trouvé cette page: https://stackoverflow.com/questions/8457902/how-to- Spécifier-un-moins-que-aujourd'hui-condition-sur-un-date-dans-rails-active-record Semble comme scope.where() itère sur ActiveRecord relation, de sorte que la syntaxe est quelle que soit ActiveRecord relation (je pensais c'est une boîte noire sans documentation: D) – Zhang

+0

Pas de documentation ?? !!!! http://guides.rubyonrails.org/active_record_querying.html Rails est extrêmement bien documenté. –

+0

Oui, je suis éclairé maintenant. Je n'étais pas au courant que 'scope.where' de Pundit est en fait une relation ActiveRecord, donc tout le temps je me grattais la tête et vérifiais la page Github de Pundit pour voir la documentation supplémentaire concernant la clause multiple. Sur la page Pithit Github, c'est un seul point, on pourrait facilement le manquer: P – Zhang

1

En fait, il est, vous pouvez faire

champ .où (publié: true) .où ("? Expire_date>", Time.now)

+0

A dû donner à Tom Lord la coche pour l'explication supplémentaire concernant l'architecture du système. Merci pour la réponse néanmoins, je voudrais pouvoir doubler vous voter: D – Zhang