如果我只想退回已发布但尚未过期的提案,Pundit可以提供这个吗?
到目前为止,我有这个:
class ProposalPolicy < ApplicationPolicy
class Scope < Scope
def resolve
if @user.admin?
scope.all
else
scope.where(published: true)
end
end
end
...
end
一种解决方法是在我的提案控制器的index
操作中编写额外的代码,以进一步将提案实例列表过滤到未过期的提案。
我希望有这样一些神奇的语法:
scope.where({published: true, expire_date > Time.now })
有什么想法吗? :d
答案 0 :(得分:2)
您可以在一个where
命令中执行此操作:
scope.where('published = ? AND expire_date > ?', true, Time.now)
或者,分成两部分:
scope.where(published: true)
.where('expire_date > ?', Time.now)
至于这个逻辑应该去哪里,这取决于你。
如果它确实是对政策的限制(即只有管理员允许才能看到过期/未发布的提案),那么请将其放入Pundit范围。
另一方面,如果非管理员只是为了方便而显示过滤列表 (但仍然可以通过其他方式查看过期/未发布的提案),那么我宁愿把这个在控制器中查询。
答案 1 :(得分:1)
实际上有,你可以做到
范围 .where(已发布:true) .where(“expire_date&gt;?”,Time.now)