【问题标题】:Optimise ActiveRecord Query优化 ActiveRecord 查询
【发布时间】:2011-09-02 05:27:50
【问题描述】:

我一直在优化我的 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

这个想法是它会选择一些随机流派,其中包含媒体。一旦被选中,它就会对评分最高的媒体进行排序,我认为会采用“顶级媒体”并在视图中使用它。

这是一个相当昂贵、丑陋的查询,我想要一些可以优化它的方法。

我可以将媒体选择滚动到原始查询中吗?

我是否应该从另一个方向着手并随机选择高评价媒体并从中获取类型? (也可以接受,但如果它没有提供任何改进,那么他们没有意义)

我在 InnoDB 中使用 Rails 3、Ruby 1.9.2 和 MySQL。

【问题讨论】:

  • 如果您可以发布与此查询相关的表的精简示例,将会很有帮助。还有,上面的方法在哪个模型中?
  • 两张表。流派和媒体 媒体通过多对一属于流派。

标签: mysql ruby-on-rails ruby-on-rails-3 activerecord


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多