Сначала признайте, что это:
@results = @search.results.for_rent.residential.order("#{ @sort_by } #{ @sort_order }").all.paginate(page: @page, per_page: @per_page)
эквивалентно:
@results = @search.results
@results = @results.for_rent
@results = @results.residential
@results = @results.order(@sort_by => @sort_order).paginate(page: @page, per_page: @per_page)
Предполагая, что @sort_by
и @sort_order
всегда установлены, конечно.Важно то, что вы можете строить запрос по частям и выбирать, какие части добавлять в зависимости от переменных вашего экземпляра.Вы можете добавить пару простых помощников:
def add_property_status_to(query)
case @property_status
when :rent, :sale
query.public_send("for_#{@property_type}")
else
query
end
end
def add_property_type_to(query)
case @property_type
when :residential, :commercial
query.public_send(@property_type)
else
query
end
end
и затем сказать что-то вроде этого:
query = @search.results
query = add_property_status_to(query)
query = add_property_type_to(query)
@results = query.order(@sort_by => @sort_order).paginate(page: @page, per_page: @per_page)
Вы можете думать о методах add_property_status_to
и add_property_type_to
как о локальном одноразовом использованииприцелы.Если вам нужно использовать их в нескольких местах, вы можете использовать их как классовые методы на @search.results
и говорить что-то вроде:
query = @search.results
query = query.with_property_status(@property_status)
query = query.with_property_type(@property_type)
@results = query.order(@sort_by => @sort_order).paginate(page: @page, per_page: @per_page)