2010-10-31 3 views
1

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

@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, а карта не нуждается в разбивке на страницы.

+0

Что вы подразумеваете под словом "не работает"? – shingara

+0

не возвращает результатов. – holden

ответ

4

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

Ie:

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 еще одним плагином, более специализированным в создании объектов поиска с использованием областей применения модели.

+0

Не могли бы вы подробнее рассказать о «Fruit.scoped» - откуда эта область? –

+0

@MikeBevz: Я тоже это задавался. Я нашел: http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html –

Смежные вопросы