1

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

这是我的代码的总体思路(请注意User has_one FooBar是数据的任意模型,: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.

4

1 回答 1

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

于 2012-05-22T17:43:38.500 回答