Как использовать 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
Другие вопросы по тегам