Как использовать named_scope для фильтрации записей в моей модели
У меня есть модель "Продукт" с полем "описание". Теперь я хочу, чтобы на странице индекса была ссылка, по которой при нажатии будут отображаться все товары, описание которых пустое (пустое).
В модели я определил named_scope следующим образом
named_scope :no_description, :conditions => { :description => "" }
Я проверил, что named_scope работает, вызвав Product.no_description.count на консоли.
Насколько я знаю, контроллер должен обрабатывать запрос фильтра по ссылке в действии "index", но иметь возможность отличить его от значения по умолчанию, которое означает просмотр всех продуктов.
def index
@products = Product.all
...
Моя проблема заключается в том, чтобы заставить контроллер обрабатывать другой запрос, какой маршрут настроить для ссылки в представлении и действительной ссылки в представлении. Надеюсь, я объяснил свою проблему.
2 ответа
Если ваша ссылка передает параметр, вы можете проверить это и использовать именованную область действия в действии index:
def index
if params[:no_description]
@products = Product.no_description
else
@products = Product.all
end
end
На ваш взгляд, вы можете использовать что-то вроде:
link_to('No description', products_path(:no_description => 1))
Есть два основных подхода, которые вы можете использовать. Вы можете настроить новый маршрут и действие контроллера для отображения продуктов без описания, или вы можете использовать параметр строки запроса в гиперссылке, чтобы сделать различие. Я бы выбрал второй подход, чтобы не загромождать контроллер слишком большим количеством действий.
Ваша ссылка будет выглядеть примерно так, если вы используете RESTful маршрутизацию:
<%= link_to 'Products Without Descriptions', products_path(:filter => true) %>
А вот действие контроллера, которое просто ищет наличие параметра (т.е. ему все равно, какое значение он имеет):
def index
if params[:filter]
@products = Product.no_description
else
@products = Product.all
end
...
end