2012-06-21 5 views
4

У меня есть возможность найти продукт, принадлежащий конкретному клиенту.рельсы 3.2 Область применения с необязательным параметром

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

и могут быть вызваны

Product.client(parameter) 

Есть ли способ, я могу заявить свою область, чтобы вернуть все продукты, если идентификатор клиента не дано? Это ситуация, когда область применения не должна использоваться?

ответ

1

Вы должны использовать что-то иное, кроме области видимости, так как вы действительно хотите переключаться между двумя случаями (с указанным идентификатором клиента) и отвечать по-другому. Как об этом:

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 все равно ...

+0

Я получаю слишком мало аргументов ошибку, если client_id не предусмотрено , Я что-то упускаю? – ctilley79

+0

Вы должны называть его «клиентом», даже если «клиент» - «нуль». Если вы пытаетесь называть его «Product.by_client()» без аргумента, используйте вместо этого версию «Product.all» в этом коде! – Peter

+2

Вы можете настроить метод 'self.by_client (client = nil)', так что вам не нужно указывать «клиент», но это кажется глупым для меня, потому что вы в конечном итоге должны иметь оператор 'if' где-то еще в вашем коде, чтобы решить, следует ли передавать «клиент» или нет. Если вы это делаете, просто позвоните в нужную вам версию. – Peter

6

Он может нормально работать с областями

scope :client, lambda {|client = nil| where("client_id = ?", client) unless client.nil? } 
Смежные вопросы