Как выполнить пользовательскую сортировку на основе интересов пользователя? - PullRequest
1 голос
/ 15 марта 2019

В существующем контроллере продуктов мы сортируем продукты по цене.

def index
  @products = Product.all.order(price: :asc)
  @products = @products.paginate(:page => params[:page], :per_page => 20)
end

Теперь я хотел бы изменить сортировку так, чтобы мы интересовали пользователей.Общая политика сортировки будет выглядеть так:

  1. элементы, принадлежащие заинтересованным пользователям категориям, будут перечислены вверху.Остальные товары будут перечислены позже.

  2. В рамках группы, заинтересованной пользователем, товары должны быть заказаны на основе цены.(аналогичный подход для неинтересной группировки).

Таблица пользователей

id  name    interested_categories   
1   Alice   [ 10, 11 ]  
2   Bruce   [ 11 ]  
3   Carol   [ 10, 12 ]  

Таблица категорий

id  category_name       
10  School      
11  Kitchen     
12  Camping

Таблица продуктов

id  product_name price category_id
1   pencil       2     10

Ответы [ 2 ]

1 голос
/ 15 марта 2019

вы можете попробовать это

def index
  filtered_products = Product.where(category_id: current_user.interested_categories)
  all_products = Product.where.not(category_id: current_user.interested_categories).order(price: :asc)
  @final_products = (filtered_products+all_products).paginate(:page => params[:page], :per_page => 20)
end

тогда ваши взгляды получат @final_products или просто измените переменную на @products

0 голосов
/ 15 марта 2019
filtered_products = Product.where(category_id: current_user.interested_categories).to_a.sort_by { |product| [product.category, product.price] }
remaining_products = Product.where.not(category_id: current_user.interested_categories).to_a.sort_by { |product| product.price } 
@products = filtered_products + remaining_products.paginate

Преобразование в массив позволяет использовать sort_by для сортировки по двум критериям.

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