Как использовать named_scope для фильтрации записей в моей модели - PullRequest
0 голосов
/ 17 июня 2010

У меня есть модель "Продукт" с полем "описание".Теперь я хочу, чтобы на странице индекса была ссылка, по которой при нажатии будут отображаться все продукты, описание которых пустое (пустое).

В модели, которую я определил named_scope, например,

named_scope :no_description,      :conditions => { :description => "" }

Я проверил, что named_scope работает, вызвав Product.no_description.count на консоли.

Насколько мне известно, контроллер должен обрабатывать запрос фильтра по ссылке в "index"действие, но можно отличить его от значения по умолчанию, которое является просмотром всех продуктов.

 def index
    @products = Product.all
    ...

Моя проблема заключается в том, чтобы заставить контроллер обработать другой запрос, какой маршрут настроить для ссылки в представлении и действительной ссылкина вид.Надеюсь, я объяснил свою проблему.

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Существует два основных подхода.Вы можете настроить новый маршрут и действие контроллера для отображения продуктов без описания, или вы можете использовать параметр строки запроса в гиперссылке, чтобы сделать различие.Я бы выбрал второй подход, чтобы избежать загромождения контроллера слишком большим количеством действий.

Ваша ссылка будет выглядеть примерно так, если вы используете 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
1 голос
/ 17 июня 2010

Если ваша ссылка передает параметр, вы можете проверить это и использовать именованную область в действии индекса:

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))
...