1

使用 Rails 3,我是 RoR 菜鸟,所以这可能很简单,但我似乎无法弄清楚。我的意思是,我可以让它工作,但我想不出最好的方法。

好的,我已经阅读了关于通过 Rails 选择随机记录的所有问题,而且我认为答案很简单,在大多数情况下。但是,我不得不在选择随机记录之前调用acts_as_taggable_on_steroids 方法,所以我首选的技术不起作用,因为 find_tagged_with 返回一个数组。

这是一个两部分的问题。从性能的角度来看,我需要知道哪些方法是最好的,以及如果使用不同的 tag.name 多次调用此方法,如何防止重复的帖子出现在结果中。

以下是我迄今为止尝试过的方法:

  def related_posts(tag)
    rand_id = rand(Post.find_tagged_with(tag.name).count)
    rand_record = Post.find_tagged_with(tag.name, :conditions => [ "posts.id >= ?", rand_id], :limit => 2)
  end

  def related_posts(tag)
    rand_id = rand(Post.find_tagged_with(tag.name).count)
    post = Post.find_tagged_with(tag.name, :offset => rand_id, :limit => 2)
  end  

  def related_posts(tag)
    post = Post.find_tagged_with(tag.name, :order => 'RAND()', :limit => 2)
  end

  def related_posts(tag)
    posts = Post.find_tagged_with(tag.name)
    offset = rand(posts.count)
    posts.find(:offset =>offset) #doesn't work since this is an array at this point :(
  end

  def related_posts(tag)
    related = []
    posts = Post.find_tagged_with(tag.name)
    related << random_post(posts)
    related << random_post(posts)
    return related
  end
  def random_post(obj)
    rand_id = rand(obj.count)
    rand_record = obj[rand_id]
  end

编辑:这似乎是最快的,虽然我对性能测试轨道应用程序的经验很少。

  def related_posts(tag)
    posts = Post.find_tagged_with(tag.name).sort_by { rand }.slice(0, 2)
  end

谁碰巧回答了这个问题,您能否解释一下到底发生了什么?是在数据库级别或其他方面随机化记录和排序。此外,这对于 Rails 应用程序的性能通常意味着什么?

4

1 回答 1

1

我会为你分解这条线:

posts = Post.find_tagged_with(tag.name).sort_by { rand }.slice(0, 2)

对find_tagged_with的第一个链式调用设置 SQL 并执行查询。我想它是一个 ActiveRecord::Relation 对象。

第二个,sort_by是一个内置的 Rails 方法。所以它不使用数据库进行排序。如果您在第一次调用中提取了数万条记录,这可能会变得昂贵。更多信息在这里: http: //paulsturgess.co.uk/articles/show/85-ruby-on-rails-sort_by-vs-sort

最后,slice(0, 2)是一个 Array 方法,用于分割结果数组。还有很多其他方法可以做到这一点,例如.first( 2 )[0..2]

此外,这里有详细的 Ruby on Rails 基准测试指南(对每种方法进行性能测试): http: //guides.rubyonrails.org/performance_testing.html

于 2011-06-26T07:12:37.907 回答