сломать сложный поисковый запрос в Rails 3 - PullRequest
1 голос
/ 31 октября 2010

У меня есть контроллер, у которого есть много опций, отправляемых ему через форму, и я задаюсь вопросом, как лучше выделить их, так как они не все используются одновременно.Т.е. иногда нет тэгов, иногда цены не указаны.Для цен у меня установлена ​​цена по умолчанию, поэтому я могу работать с ней всегда, но теги либо должны быть, либо нет.и т.д.

@locations = Location.find(params[:id])

@location = @locations.places.active.where("cache_price BETWEEN ? AND ?",price_low,price_high).tagged_with([params[:tags]).order(params[:sort]).paginate :page => params[:page]

Я не видел хороших примеров этого, но уверен, что это должно случаться часто ... какие-нибудь предложения?Кроме того, даже will_paginate, который будет добавлен последним, должен быть необязательным, так как результаты идут либо в список, либо на карту Google, и карта не нуждается в нумерации страниц.

1 Ответ

4 голосов
/ 31 октября 2010

Первое, что нужно сделать при рефакторинге сложного поискового действия, - это использовать анонимную область.

Т.е.:

fruits = Fruit.scoped
fruits = fruits.where(:colour => 'red') if options[:red_only]
fruits = fruits.where(:size => 'big') if options[:big_only]
fruits = fruits.limit(10) if options[:only_first]
...

Если контроллер действия все еще остается слишком большим, вы можете использоватькласс для обработки поиска.Более того, используя класс с Rails 3 и ActiveModel, вы также сможете использовать валидации, если хотите ...

Взгляните на один из моих плагинов: http://github.com/novagile/basic_active_model, который позволяет вамчтобы легко создавать классы, которые можно использовать в формах.

Также взгляните на http://github.com/novagile/scoped-search еще один плагин, более специализированный для создания объектов поиска с использованием областей действия модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...