Rails - 未处理的控制器动作搞乱序列化属性

时间:2012-05-22 01:16:39

标签: sql ruby-on-rails caching

我有一个控制器动作,它调用一个模型方法,该方法生成从另一个模型数据库中提取的序列化数据列表。我需要这个uncached,因为SQL查询应该是随机数据拉取。

以下是我的代码的一般概念(请注意User has_one FooBar是数据的任意模型,: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}}。

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