我有一个控制器动作,它调用一个模型方法,该方法生成从另一个模型数据库中提取的序列化数据列表。我需要这个uncached
,因为SQL查询应该是随机数据拉取。
以下是我的代码的一般概念(请注意User
has_one
Foo
,Bar
是数据的任意模型,:data_list
的类型为{ {1}},数据库是SQLite):
text
# 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
中打印出每组Bar
个对象。不幸的是,由于Rails的SQL缓存,它最终看起来像这样:
RandomDataPoint8
RandomDataPoint8
RandomDataPoint8
RandomDataPoint8
当我需要这样的时候:
RandomDataPoint7
RandomDataPoint13
RandomDataPoint2
RandomDataPoint21
应该注意,从Rails命令行运行@user.foo.data_list
与随机化完美配合。只有当从控制器调用缓存开始时才会发生。
我的研究建议我在控制器中使用user.foo.generate_data
来删除缓存,但它似乎会破坏我的数据序列化并收到错误:
uncached
事实上,即使我追溯性地添加undefined method 'each' for #<String:0x007ff49008dc70>
(已成功生成uncached
之前没有data_plan
)并保存控制器,它也会这样做,但不要调用{{ 1}}。
答案 0 :(得分:0)
修改强>
我相信这个问题实际上与我在散列中存储对象的事实有关。切换到对象id
修复了此问题。关于这一点的另一个SO问题可以在这里找到:
Rails - Accessing serialized data from console
保留以下内容只是因为语法可能仍然可以帮助人们,但我不相信这是问题的真正原因。
我通过将uncached
移动到模型来解决这个问题。作为参考,我用来最初解决这个问题的来源是这个链接:http://railspikes.com/2008/8/18/disabling-activerecord-query-caching-when-needed
我忽略的是他将uncached
放在模型中,而不是控制器中。此外,语法需要略有不同:
# app/models/foo.rb
self.class.uncached do
...
end
而不是
uncached do
...
end
语法更正的来源是此SO响应:https://stackoverflow.com/a/967690/337903