【发布时间】:2012-05-22 01:16:38
【问题描述】:
我有一个控制器操作,它调用模型方法,该方法生成从另一个模型数据库中提取的数据的序列化列表。我需要将其设为 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 视图打印出@user.foo.data_list 中的每组Bar 对象。不幸的是,由于 Rails 的 SQL 缓存,它最终看起来像这样:
随机数据点8
随机数据点8
随机数据点8
随机数据点8
当我需要看起来像这样时:
随机数据点7
随机数据点13
随机数据点2
随机数据点21
需要注意的是,从 Rails 命令行运行 user.foo.generate_data 可以完美配合随机化。只有从控制器调用时才会开始缓存。
我的研究建议我在控制器中使用uncached 来删除缓存,但它似乎破坏了我的数据序列化并且我收到了错误:
undefined method 'each' for #<String:0x007ff49008dc70>
事实上,即使我追溯添加uncached(在没有uncached之前成功生成data_plan)并保存控制器,它也会这样做,但不要调用generate_action。
【问题讨论】:
标签: sql ruby-on-rails caching