2011-01-05 2 views
1

Product имеет следующие атрибуты:Rails: как фильтровать и сортировать продукты?

  • магазин
  • модель
  • цена

Model принадлежит:

  • бренд

Учитывая @products, как:

Shop Brand Model Price 
---- ----- ----- ----- 
Ebay Sony  S-100 500 
Ebay Sony  S-200 1000  (in Target it's cheaper) 
Ebay Dell  D-55  300 
Target Sony  S-100 600   (in Ebay it's cheaper) 
Target Sony  S-200 900 
Amazon Dell  D-33  100 

Я хотел бы, чтобы отфильтровать только те, с самой низкой ценой, то есть я ожидаю получить:

Shop Brand Model Price 
---- ----- ----- ----- 
Ebay Sony  S-100 500 
Ebay Dell  D-55  300 
Target Sony  S-200 900 
Amazon Dell  D-33  100 

и предпочтительно сортировать по Brand, а затем Model :

Shop Brand Model Price 
---- ----- ----- ----- 
Ebay Sony  S-100 500 
Target Sony  S-200 900 
Amazon Dell  D-33  100 
Ebay Dell  D-55  300 

Как я могу это сделать?

ответ

0

Вы будете довольны сортировкой базы данных?

@products.order('brand_id, price') 

EDIT: Фильтр и порядок

EDIT2: Не индексировать, но группа по модели

EDIT3: Сортировать по марке, а затем модель

EDIT4: Не останавливайтесь, пока нет сферы для улучшения. Лучшая разновидность сортировки

def lowest_priced(products) 
    # All products are grouped by the model (key is model, value is array of products belonging to that model) 
    per_model = products.group_by{|x|x.model} 
    # Hash of lowest products per model 
    lowest = {} 
    per_model.keys.each do |model| 
    # Find lowest priced product for the model 
    lowest[model] = per_model[model].min_by{|p| p.price} 
    end 
    # Sort the values of the hash 
    return lowest.values.sort_by{|p| [p.model.brand,p.model]} 
end 

Вы бы в идеале отредактировали код выше, чтобы каждая функция имела только одну ответственность.

+0

Предполагается ли фильтр? –

+0

aah! Поэтому вам нужно сгруппировать модель_id, выбрать самую дешевую и затем отсортированную. Вы можете сделать это в базе данных с напуганным запросом, но это очень опасно, будет ли оно переносимым или нет. Я обновляю свой ответ с помощью рубинового решения (разумеется, это означает, что будут отображены ВСЕ записи). –

+0

Выбор всех записей и использование всех этих перечислимых методов будет очень медленным с большим объемом данных и приносит ненужную сложность. Я бы избегал этой техники любой ценой, если вы не знаете, что когда-либо имеете дело с небольшими объемами данных. – idlefingers

0

Используйте поисковик драгоценный камень. он создает множество областей для поиска и заказа. например

Product.search(:order => :ascend_by_model) 
+0

searchlogic не очень хорошо работает с Rails 3 и не поддерживается или обновляется в течение некоторого времени. –

0

Вы должны быть в состоянии сделать это в одном запросе путем объединения таблиц, группировка, чтобы получить только один результат на модели и заказные вернуться в нужном порядке. Следующие должны быть вдоль линий, что вам нужно:

Product.joins(:model => :brand).group("models.name").order("products.price, brands.name, models.name") 

Я догадывался модель и бренд таблицы имеют столбец с именем имя или что-то, что название модели и марки имя хранится в

.