如何在rails 5中使用交替排序创建查询?

时间:2017-11-07 15:53:25

标签: jquery ruby-on-rails

我的数据库中有以下格式

产品
- 姓名
- 商店ID

以下记录

产品1 - 商店1 产品2 - 商店1 产品3 - 商店3 产品4 - 商店1 产品5 - 商店2 产品6 - 商店2 产品7 - 商店1 产品8 - 商店1 产品9 - 商店3 产品10-商店3

我想做一个查询,其中我将结果与“Id Store”交替显示,这看起来像这样:

产品1 - 商店1 产品5 - 商店2 产品3 - 商店3 产品2 - 商店1 产品6 - 商店2 产品9 - 商店3 产品4 - 商店1 产品10-商店3
产品7 - 商店1 产品8 - 商店1

此商家信息仍会被分页。

1 个答案:

答案 0 :(得分:0)

你可能需要这样做是Rails。您需要将所有不同的商店分组为单独的数组。然后使用嵌套循环弹出每个数组的第一个记录,直到它们都为空。我猜大多数情况会发生在Rails中,对数据库只有一两次查询。

这样的事情:

# Initialize product grouping hash
grouped_products = {}

# Produces hash of product arrays.
# Each array contains all of the products for a shop.
Products.all.order(:shop_id, :name).each do | product |
  grouped_products[product.shop_id] = [] if grouped_products[product.shop_id].nil?
  grouped_products[product.shop_id] << product
end

# Now we turn all of our grouped arrays into enumerators
grouped_products.each_key do | key |
  grouped_products[key] = grouped_products[key].each
end

alternating_products = []

# Here we build the alternating products array
loop do

  # Get the next product from the top of each grouped array
  grouped_products.each_key do |key|
    # Add the next product from the current array to the alternating array
    begin
      alternating_products << grouped_products[key].next
    # If at the end of the current array, remove it from the hash
    rescue StopIteration
      grouped_products.except! key
    end
  end

  # Stop looping when all arrays are empty and removed from hash
  break if grouped_products.empty?
end

alternating_products

我没有测试过上面的代码,所以可能需要进行一些调整。

这需要循环整个数据集两次。

由于这会返回一个有序数组,因此您可以非常轻松地进行分页。例如:要使用alternating_products[0..9]获取前10条记录。要获得第二组10条记录,请使用alternating_products[10..19]等等。