我有一个数组@products
。数组的每个元素都是一个哈希,包含Product
表中的几个字段(但不是全部)和相应的值。
我在descend_by_popularity
中有一个范围Product
,它允许我根据popularity
字段对产品进行排序。我想使用此范围对数组@products
进行排序。
我尝试了什么:
@product_group = Array.new
@products.each do |product|
@product_group.push(Product.find(product['id']))
end
@product_group1 = @product_group.descend_by_popularity
但是这给了我错误:
undefined method `descend_by_popularity' for #<Array:0xb2497200>
我还想将已排序的Product
列表更改回@products
数组的格式。
由于
答案 0 :(得分:1)
范围仅在ActiveRecord上下文中对数据库的请求有意义(因为它用于更改SQL查询)。你做的是把很多产品扔进阵列。然后,这个数组不再了解范围。在创建@products对象时,您必须使用范围。 (将查询结果移动到数组中似乎没有多大意义)
类似
@products = Product.descend_by_popularity.where(some more stuff)
应该适合你。之后,您应该按照作用域定义的顺序记录这些记录,然后可以直接使用它们,或者仍然将它们推入数组中,如果这是您想要做的事情。
使用评论中的更新信息看起来似乎最好的方法是首先将solr响应中的产品ID收集到一个数组中,然后将其作为搜索与您的范围一起运行:
@product_group = @products.map{|product| product.id}
@result = Product.where(id: @product_group).descend_by_popularity
这在技术上应该起作用,性能是一个不同的问题。我会考虑将这些数据汇总到Solr文档中,如果它没有经常更改的话。
现在假设您只对产品的订单感兴趣,您可以这样做,以便将@products纳入此订单:
@result.map{|r| @products.find{|p| p[:id] == r.id}
虽然这可能会减慢一些事情。
答案 1 :(得分:0)
试试这个:find_by_id as params
@product_group = Array.new
@products.each do |product|
@product_group.push(Product.find(params['id']))
end
并返回@product_group
的数组@product_group1 = @product_group.descend_by_popularity