Рельсы: Как фильтровать и сортировать товары? - PullRequest
3 голосов
/ 05 января 2011

Product имеет следующие атрибуты:

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

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

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

Ответы [ 3 ]

1 голос
/ 05 января 2011

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

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

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

0 голосов
/ 05 января 2011

Используйте searchlogic gem. он генерирует много областей для поиска и упорядочения. например

Product.search(:order => :ascend_by_model)
0 голосов
/ 05 января 2011

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

@products.order('brand_id, price')

РЕДАКТИРОВАТЬ: Фильтр и порядок

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

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

РЕДАКТИРОВАТЬ4: Не останавливайтесь, пока есть возможности для улучшения. Лучшая многопрофильная сортировка

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

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

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