2012-06-21 38 views
4

我有以下範圍用於查找屬於特定客戶端的產品。rails 3.2可選參數的範圍

scope :client, lambda {|client| where("client_id = ?", client) } 

,並可以通過

Product.client(parameter) 

被稱爲有什麼辦法,如果沒有給客戶端ID我可以宣佈我的範圍,以返回所有產品?這是不應該使用範圍的情況嗎?

回答

1

您應該使用除範圍之外的其他東西,因爲您確實想要在兩種情況之間切換(使用/不指定客戶端ID)並以不同方式響應。這個怎麼樣:

class Product < ActiveRecord::Base 
    def self.by_client(client) 
    if client 
     where(client_id: client) 
    else 
     all 
    end 
    end 
end 

該代碼會始終返回類似的scope輸出,這樣你就可以用鏈等它

注意,這也收拾的代碼,不需要特別的範圍。並確保你實際上並不意味着有has_many :clientsProduct反正...

+0

我得到一個參數太少錯誤,如果不提供的client_id 。我錯過了什麼嗎? – ctilley79

+0

即使'client'是'nil',你也應該用'client'來調用它。如果您試圖將其稱爲'Product.by_client()'而不帶參數,那麼只需在該代碼中使用'Product.all'版本即可! – Peter

+2

您可以將方法調整爲'self.by_client(client = nil)',這樣您就不需要指定'client',但這對我來說似乎很愚蠢,因爲您最終會在某處發出if語句否則在你的代碼中決定是否傳遞一個「客戶端」。如果你這樣做,只需在該代碼中調用你想要的版本即可。 – Peter

6

它可以工作確定與範圍

scope :client, lambda {|client = nil| where("client_id = ?", client) unless client.nil? }