我必须在同一页面上输出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
答案 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