2017-05-29 43 views
0

如果我只想返回已發佈但未到期的提案,這對於評論家來說有可能嗎?已批准但未過期的專家範圍條件

到目前爲止,我有這樣的:

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

回答

1

你可以做到這一點單個where命令:

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

或者,分成兩個:

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

至於這個邏輯應該去哪裏,這取決於你。

如果這是真的政策的限制(即只有管理員是允許看到過期/未公佈的建議),然後把它放在權威人士範圍。另一方面,如果非管理員只是爲了方便而顯示過濾列表(但仍可以通過其他方式查看過期/未發佈的提議),那麼我寧願將此查詢放入控制器中。

+0

是的,似乎我沒有足夠的谷歌,我發現這個網頁:https://stackoverflow.com/questions/8457902/how-to-指定-a-less-than-today-condition-on-a-date-in-rails-active-record看起來像scope.where()迭代ActiveRecord關係,所以語法是無論ActiveRecord關係是什麼(我曾經想過這是一些沒有文件的黑盒子:D) – Zhang

+0

沒有文件?? !!!! http://guides.rubyonrails.org/active_record_querying.html Rails是非常有據可查的。 –

+0

是的,我現在開悟了。我不知道Pundit的'scope.where'實際上是ActiveRecord關係,所以整個過程中我一直在摸索我的頭並檢查Pundit的Github頁面以查看關於多個子句的額外文檔。在Pundit Github頁面上,它是一個單一的重點,可以很容易地忽略它:P – Zhang

1

居然還有,你可以做

範圍 。凡(公佈:真) 。凡( 「?EXPIRE_DATE>」,Time.now)

+0

不得不給湯姆洛德關於系統體系結構的額外解釋。謝謝你的答案,然而,希望我可以加倍投票你:D – Zhang