如何根据用户兴趣定制排序?

时间:2019-03-15 10:53:43

标签: ruby-on-rails activerecord

在现有的产品控制器中,我们根据价格对产品进行分类。

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 个答案:

答案 0 :(得分:1)

您可以尝试

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

答案 1 :(得分:0)

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来按两个条件排序。