我有一个控制器操作,它调用一个模型方法,该方法生成从另一个模型数据库中提取的数据的序列化列表。我需要这样做,uncached
因为 SQL 查询应该是随机数据拉取。
这是我的代码的总体思路(请注意User
has_one
Foo
,Bar
是数据的任意模型,:data_list
类型为text
,并且数据库是 SQLite):
# app/models/foo.rb
class Foo < ActiveRecord::Base
serialize :data_list
def generate_data
list = []
for i in 1..4
data = Bar.find(:first, :order => "Random()")
list << data
end
self.data_list = list
end
end
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def generate_action
...
uncached do
@user.foo.generate_data
end
@user.foo.save
end
end
# app/views/user/show.html.erb
...
<% @user.foo.data_list.each do |data| %>
<%= data %><br />
<% end %>
无论何时uncached do ... end
删除,一切正常,视图打印 show
出. 不幸的是,由于 Rails 的 SQL 缓存,它最终看起来像这样:Bar
@user.foo.data_list
随机
数据点8 随机
数据点8 随机数据点8
随机数据点8
当我需要看起来像这样时:
随机
数据点 7 随机
数据点 13 随机数据点 2
随机数据点 21
应该注意的是,user.foo.generate_data
从 Rails 命令行运行与随机化完美配合。只有从控制器调用时才会开始缓存。
我的研究建议我uncached
在控制器中使用来删除缓存,但是它似乎破坏了我的数据序列化并且我收到了错误:
undefined method 'each' for #<String:0x007ff49008dc70>
事实上,即使我追溯添加uncached
(已成功生成data_plan
没有uncached
事先的 a )并保存控制器,它也会这样做,但不要调用generate_action
.