我的数据库中有以下格式
产品
- 姓名
- 商店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
此商家信息仍会被分页。
答案 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]
等等。