Ruby on Rails通过acts_as_taggable_on_steroids随机发布

时间:2011-06-26 03:35:43

标签: ruby-on-rails ruby ruby-on-rails-3 acts-as-taggable-on-ster

使用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

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

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

无论谁碰巧回答这个问题,您还可以解释究竟发生了什么吗?是随机化记录并在数据库级别或其他方面进行排序。此外,这通常意味着使用rails应用程序的性能?

1 个答案:

答案 0 :(得分: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

最后,切片(0,2)是一种Array方法,会切断您的结果数组。还有很多其他的方法,例如 .first(2) [0..2]

此外,这是一个详细的Ruby on Rails指南(基准测试)({3}}