Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-on-Rails随机Post-via作为类固醇_Ruby On Rails_Ruby_Ruby On Rails 3_Acts As Taggable On Ster - Fatal编程技术网

Ruby-on-Rails随机Post-via作为类固醇

Ruby-on-Rails随机Post-via作为类固醇,ruby-on-rails,ruby,ruby-on-rails-3,acts-as-taggable-on-ster,Ruby On Rails,Ruby,Ruby On Rails 3,Acts As Taggable On Ster,使用Rails 3,我是一个RoR noob,所以这可能很简单,但我似乎无法理解。我的意思是,我可以让它工作,但我想不出最好的办法 好的,我已经阅读了关于通过Rails选择随机记录的每一个问题,我认为答案在很大程度上是非常直接的。但是,在选择随机记录之前,我不得不调用acts\u as\u taggable\u on\u类固醇方法,因此我首选的技术不起作用,因为find\u taged\u with返回一个数组 这是一个由两部分组成的问题。我需要知道从性能的角度来看,这些方法中的哪种是最好的,并

使用Rails 3,我是一个RoR noob,所以这可能很简单,但我似乎无法理解。我的意思是,我可以让它工作,但我想不出最好的办法

好的,我已经阅读了关于通过Rails选择随机记录的每一个问题,我认为答案在很大程度上是非常直接的。但是,在选择随机记录之前,我不得不调用acts\u as\u taggable\u on\u类固醇方法,因此我首选的技术不起作用,因为find\u taged\u 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应用程序在性能方面通常意味着什么?

我将为您详细介绍这一行:

posts = Post.find_tagged_with(tag.name).sort_by { rand }.slice(0, 2)
find_taged_with的第一个链式调用设置SQL并执行查询。我想象它是一个ActiveRecord::Relation对象

第二种,sort\u by是一种内置的Rails方法。所以它没有使用数据库进行排序。如果你在第一次通话中就提取了数万条记录,这可能会变得昂贵。更多信息请点击此处:

最后,切片(0,2)是一种数组方法,用于分割结果数组。有很多其他方法可以做到这一点,比如。第一(2)[0..2]


另外,这里有一个详细的RubyonRails基准测试指南(每种方法的性能测试):

我将为您详细介绍这一行:

posts = Post.find_tagged_with(tag.name).sort_by { rand }.slice(0, 2)
find_taged_with的第一个链式调用设置SQL并执行查询。我想象它是一个ActiveRecord::Relation对象

第二种,sort\u by是一种内置的Rails方法。所以它没有使用数据库进行排序。如果你在第一次通话中就提取了数万条记录,这可能会变得昂贵。更多信息请点击此处:

最后,切片(0,2)是一种数组方法,用于分割结果数组。有很多其他方法可以做到这一点,比如。第一(2)[0..2]


另外,这里有一个详细的RubyonRails基准测试指南(每个方法的性能测试):

slice(0,2)和.first(2)之间有性能差异吗?仍然很难让性能测试正常工作。我将把这个问题留给一个新问题。切片(0,2)和.first(2)之间是否存在性能差异?仍然很难让性能测试正常工作。我会留着问一个新问题。