【问题标题】:Rails 3 serialized hash values saving but not persistingRails 3 序列化哈希值保存但不持久
【发布时间】:2018-05-16 02:59:00
【问题描述】:

我有一个带有序列化文本列的模型。当我保存并重新加载记录时,这些值似乎仍然存在,但当我查询记录时,这些值消失了。

(为简单起见,以下演示被截断)

class Subscription < ActiveRecord::Base
   serialize :pending_changes, Hash
   attr_accessible :pending_changes
   attr_accessor :pending_changes
end

class AddPendingChangesToSubscriptions < ActiveRecord::Migration
  def change
    add_column :subscriptions, :pending_changes, :text
  end
end

s = Subscription.new

s.pending_changes = {foo: "bar"}

s.save 
# => true

s.reload.pending_changes
# => {foo: "bar"}

Subscription.last.pending_changes
# => nil

{"foo" =&gt; "bar"} 保存为值时也会发生同样的情况。

我也注意到当save被调用时,得到的SQL查询如下:

UPDATE 'subscriptions' SET 'updated_at' = '2017-12-01 23:46:05', 'pending_changes' = '--- {}\n' WHERE 'subscriptions'.'id' = 2

根据类似问题的答案,我已确保 db 列数据类型为 text,并且我尝试使用 serialize :column_name 和不附加 Hash

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-3 serialization


    【解决方案1】:

    从模型中删除 attr_accessible :pending_changes 和 attr_accessible :pending_changes ,因为你在数据库中有一个列,所以不需要使用 attr_accessible 和 attr_accessor。使用下面的型号代码试试。

    class Subscription < ActiveRecord::Base
      serialize :pending_changes, Hash
    end
    

    【讨论】:

    • 成功了!谢谢。我已经养成了设置attr_accessible 的习惯,因为它是批量分配所必需的(根据我的经验)。在这种情况下,我可以不这样做。你熟悉WHYattr_accessible和序列化数据冲突吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2011-10-05
    • 2015-01-06
    • 2017-04-06
    相关资源
    最近更新 更多