保存一个哈希来序列化mysql中的哈希列,但是收到错误

时间:2015-01-04 20:43:00

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个Rails 3.2.19应用程序,它有以下类:

class Item < ActiveRecord::Base
  serialize :mig_serializer_frag, Hash

我有一个看起来像这样的after_save回调块:

  after_save do
    a={}
    a[:name]="Jon"
    a[:last_name]="Johnson"
    self.update_column(:mig_serializer_frag, a)
  end

查看sql,它会产生:

  SQL (0.4ms)  UPDATE `items` SET `mig_serializer_frag` = '---\n- :name\n- Jon\n','---\n- :last_name\n- Johnson\n' WHERE `items`.`id` = 1
   (0.7ms)  ROLLBACK
ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''---\n- :last_name\n- Johnson\n' WHERE `items`.`id` = 1' at line 1: UPDATE `items` SET `mig_serializer_frag` = '---\n- :name\n- Jon\n','---\n- :last_name\n- Johnson\n' WHERE `items`.`id` = 1
from /Users/jt/.rvm/gems/ruby-2.1.2/gems/activerecord-3.2.19/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `query'

我清楚地看到错误,但我没有完全理解序列化哈希应该是什么。我认为这是一个YAML表示,当它从db中带出来时变成了哈希。为什么rails会生成此更新语句以及如何修复它?

编辑#1

enter image description here

2 个答案:

答案 0 :(得分:1)

我很确定问题是update_column而不是代码中的任何其他问题。 update_column无法使用rails issues中记录的序列化属性。

如果您需要设置值after_save,则可能需要自己转换为yaml:

self.update_column(:mig_serializer_frag, a.to_yaml)

答案 1 :(得分:0)

我的猜测是,您尝试序列化的属性的列类型为String

将其更改为Text,rails将能够执行转换为YAML,然后将其序列化。