我使用的是Rails3,而我是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应用,这通常意味着性能方面的什么?
发布于 2011-06-26 15:12:38
我将为您分解这一行:
posts = Post.find_tagged_with(tag.name).sort_by { rand }.slice(0, 2)对SQL的第一个链式调用设置find_tagged_with并执行查询。我假设它是一个ActiveRecord::Relation对象。
第二,sort_by是一种内置的Rails方法。所以它不会使用数据库来进行排序。如果您在第一次调用中就提取了数万条记录,这可能会变得昂贵。更多信息请点击这里:http://paulsturgess.co.uk/articles/show/85-ruby-on-rails-sort_by-vs-sort
最后,数组切片(0,2)是一个方法,用于分割结果数组。有很多其他方法可以做到这一点,比如.first( 2 )或0..2
此外,这里有一个详细的Ruby on Rails基准测试指南(每种方法的性能测试):http://guides.rubyonrails.org/performance_testing.html
https://stackoverflow.com/questions/6481987
复制相似问题