【问题标题】:Rails - uncached controller action messing with serialized attributeRails - 未缓存的控制器操作与序列化属性混淆
【发布时间】:2012-05-22 01:16:38
【问题描述】:

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

以下是我的代码的大致概念(注意User has_one FooBar 是任意数据模型,:data_listtext 类型,数据库是 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 #&lt;String:0x007ff49008dc70&gt;

事实上,即使我追溯添加uncached(在没有uncached之前成功生成data_plan)并保存控制器,它也会这样做,但不要调用generate_action

【问题讨论】:

    标签: sql ruby-on-rails caching


    【解决方案1】:

    编辑
    我相信这个问题实际上与我将对象存储在哈希中的事实有关。切换到对象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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      相关资源
      最近更新 更多