2017-02-27 52 views
1

讓我們假設我有以下型號:Ruby on Rails:在將模型中的記錄返回給控制器之前,過濾列表中的記錄?

class Computer < ActiveRecord::Base 

end 

,我檢索所有的計算機在我的控制器是這樣的:

@computers = Computer.all 

現在我添加一個功能停用某些計算機和過濾,如停用計算機這樣的:

class Computer < ActiveRecord::Base 
     scope :not_deactivated, -> { where('deactivated IS NULL OR deactivated = ?', false) } 

    end 

,並在我的控制器:

@computers = Computer.all.not_deactivated 

該方法的問題是我必須在所有控制器中添加not_deactivated

是否有可能在模型中做這個過濾器,所以我不必觸摸控制器?

+0

我相信這樣做。但是您可以在控制器上執行before_action:not_deactivated行。然後把not_deactivated方法放在控制器中。 –

回答

1

簡單而平常的事中控制的事:

before_action :not_deactivated # , only [:index...] 

private 
def not_deactivated 
@computers = Computer.where(your code) 
end 

由於控制器處理的觀點,你必須以某種方式反正啓動的對象。通過這樣的過濾,您可以使用模型過濾器實現您現在要做的事情。

0

您可以通過聲明default_scope這個您撥打一個電話,每次運行到您的Computer模型

class Computer < ActiveRecord::Base 
    default_scope { where('deactivated IS NULL OR deactivated = ?', false) } 
end 

所以,當你運行​​你得到的結果是Computer.where('deactivated IS NULL OR deactivated = ?', false)

相關問題