我有以下範圍用於查找屬於特定客戶端的產品。rails 3.2可選參數的範圍
scope :client, lambda {|client| where("client_id = ?", client) }
,並可以通過
Product.client(parameter)
被稱爲有什麼辦法,如果沒有給客戶端ID我可以宣佈我的範圍,以返回所有產品?這是不應該使用範圍的情況嗎?
我有以下範圍用於查找屬於特定客戶端的產品。rails 3.2可選參數的範圍
scope :client, lambda {|client| where("client_id = ?", client) }
,並可以通過
Product.client(parameter)
被稱爲有什麼辦法,如果沒有給客戶端ID我可以宣佈我的範圍,以返回所有產品?這是不應該使用範圍的情況嗎?
您應該使用除範圍之外的其他東西,因爲您確實想要在兩種情況之間切換(使用/不指定客戶端ID)並以不同方式響應。這個怎麼樣:
class Product < ActiveRecord::Base
def self.by_client(client)
if client
where(client_id: client)
else
all
end
end
end
該代碼會始終返回類似的scope
輸出,這樣你就可以用鏈等它
注意,這也收拾的代碼,不需要特別的範圍。並確保你實際上並不意味着有has_many :clients
爲Product
反正...
它可以工作確定與範圍
scope :client, lambda {|client = nil| where("client_id = ?", client) unless client.nil? }
我得到一個參數太少錯誤,如果不提供的client_id 。我錯過了什麼嗎? – ctilley79
即使'client'是'nil',你也應該用'client'來調用它。如果您試圖將其稱爲'Product.by_client()'而不帶參數,那麼只需在該代碼中使用'Product.all'版本即可! – Peter
您可以將方法調整爲'self.by_client(client = nil)',這樣您就不需要指定'client',但這對我來說似乎很愚蠢,因爲您最終會在某處發出if語句否則在你的代碼中決定是否傳遞一個「客戶端」。如果你這樣做,只需在該代碼中調用你想要的版本即可。 – Peter