RoR:如何在范围的帮助下对数组进行排序

时间:2014-02-10 08:49:29

标签: ruby-on-rails

我有一个数组@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数组的格式。

由于

2 个答案:

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