餐厅 的has_many菜复杂的Rails/Postgres的SQL优化
Dish
has_many Photo
Photo
belongs_to Dish
Restaurant 1
Dish 1
Photo 1 May 9, 1:00 PM
Dish 2
Photo 2 May 9, 2:00 PM
Dish 3
Photo 3 May 9, 3:00 PM
Restaurant 2
Dish 4
Photo 4 May 9, 1:00 PM
Dish 5
Photo 5 May 9, 2:00 PM
Dish 6
Photo 6 May 9, 3:00 PM
我想以每2张餐厅菜照片的限制检索最新的50张照片。鉴于上述数据,我将能够检索带ID的照片2, 3, 5, and 6
我目前的实施是丑陋至少可以说。
hash = {}
bucket = []
Photo.includes(:dish => [:restaurant]).order("created_at desc").each do |p|
restaurant_id = p.dish.restaurant.id
restaurant_count = hash[restaurant_id].present? ? hash[restaurant_id] : 0
if restaurant_count < 2
bucket << p
hash[restaurant_id] = restaurant_count + 1
end
# if you've got 50 items short circuit.
end
我不禁觉得有更高效的解决方案。任何想法,将不胜感激 :-)。
这是不落实,即使在纯SQL琐碎的逻辑。您可能会更好地维护某种特定的队列结构,并始终保留这50张照片的列表。然后,您可以在灌注新照片时按2餐限制进行限制。很显然,这将针对少数写入多读的内容进行优化。 – mikeryz 2013-05-09 14:45:21
是的,那是我的下一步,因为在子查询中我真的很无能。 – lemon 2013-05-09 15:04:07
如果您因为某些Google搜索结果设置了SQL,而出现类似如下的情况:http://books.google.com/books?id=thTju-4duY4C&lpg=PP1&ots=nFmsRSwKu0&dq=enterprise%20rails&pg=PA147#v=onepage&q&f = false可能是最好的方法... – mikeryz 2013-05-09 15:22:12