Pundit范围已发布但未过期日期条件

时间:2017-05-29 11:41:03

标签: ruby-on-rails pundit

如果我只想退回已发布但尚未过期的提案,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

2 个答案:

答案 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)