我一直在优化我的Rails应用程序,但我遇到了一个特定的查询:
def self.random_selection(n)
items = scoped(:joins => "JOIN (SELECT id
FROM #{table_name}
WHERE medias_count > 0
ORDER BY RAND()
LIMIT #{n.to_i}
) AS random_ids
ON #{table_name}.id = random_ids.id"
)
items.each do |genre|
genre.medias.sort! do |x,y|
y.vote_total <=> x.vote_total
end
end
items
end
这个想法是它将选择一些在其中有媒体的随机类型。一旦被选中,它将在评价最高的媒体上排序,我认为采用“顶级媒体”并在视图中使用它。
这是一个非常昂贵,丑陋的查询,我想要一些我可以采取的优化方法。
我可以将媒体选择滚动到原始查询吗?
我应该从另一个方向接近这个并选择随机高评级的媒体并从中获取类型吗? (也可以接受,但如果它没有提供任何改进,那么他们没有意义)
我正在使用Rails 3,Ruby 1.9.2和MySQL与InnoDB。
答案 0 :(得分:1)
我的解决方案
class Genre
scope :having_media, where('medias_count > 0')
scope :random, lambda { |limit| where(:id => random_ids(limit)) }
def self.random_ids(limit)
having_media.select('id').sample(limit).map(&:id)
end
def self.random_selection(limit)
random(10).includes(:medias).each do |genre|
genre.medias.sort! do |x,y|
y.vote_total <=> x.vote_total
end
end
end
end
class Media
scope :voted_higher, reorder('vote_total desc')
end
@random_genres = Genre.random_selection(10)