Rails部分需要使用不同的内容呈现两次,但输出相等

时间:2014-02-20 16:37:40

标签: ruby-on-rails activerecord random partial

我必须在同一页面上输出2个块,每个块必须包含3个来自数据库的随机帖子。

我有简单的模型

class Post < ActiveRecord::Base
  scope :random, -> { order('RANDOM()') }
end

我将ActiveRecord代码放在 application_helper.rb 中:

module ApplicationHelper
  def random_posts(num = 3)
    posts = Post.uncached do
      Post.random.limit(num)
    end
  end
end

然后在布局中我使用此调用两次(使用超薄模板引擎

= render random_posts

使用此部分 app / views / posts / _post.html.slim

a.btn = post.title

块从数据库中填充3个随机帖子,但每个块中它们是相同的!为什么会这样?每个区块必须包含不同的帖子。

我创建了一个带有简单演示的repo here

2 个答案:

答案 0 :(得分:1)

我通过将uncached翻转到cache来实现这一目标。我正在试验Post模型,但您可以轻松地将它放在助手中:

class Post < ActiveRecord::Base
  def self.random_posts(n = 3)
    cache do
      random.limit(n)
    end
  end
end

对于使用uncached的方法的两次调用,ActiveRecord日志行为Post Load ...CACHE ...,但使用cache,它们都是Post Load...。我真的希望我能解释为什么会这样,但它完全违反直觉,对我来说毫无意义。

答案 1 :(得分:0)

分叉代码,似乎集合Post.random以某种方式缓存在Rails中。如果您在random_posts中的ApplicationHelper添加调试器:

Post.random.map(&:id) 

每次都会有相同的收藏。

取自blogpost,您可以将其作为替代选择:

ApplicationHelper.rb

def self.random_posts(num = 3)
  ids = Post.pluck(:id).shuffle[0..4]
  Post.where(id: ids)
end