【问题标题】:saving a hash to serialize Hash column in mysql but getting error保存哈希以序列化 mysql 中的哈希列但出现错误
【发布时间】:2015-01-04 20:43:00
【问题描述】:

我有一个 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

【问题讨论】:

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


    【解决方案1】:

    我很确定问题出在update_column 而不是您代码中的任何其他内容。 update_column 不适用于rails issues 中记录的序列化属性。

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

    self.update_column(:mig_serializer_frag, a.to_yaml)
    

    【讨论】:

    • 有趣的讨论。所以这有点工作,但现在 Rails 认为它​​只是一个字符串......呃......
    • 您仍然需要serialize 电话。失败的一点是序列化属性的保存,但它仍应正确检索 yaml 属性并将其再次反序列化为哈希。
    • thx Shadwell - 像大多数回调一样,我最终从after_ 变为before_,这允许正常语义,因为我不需要抑制其他回调。谢谢帮助
    【解决方案2】:

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

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

    【讨论】:

    • 我明白你在说什么,因为我看到了字符串的问题,但我们是一个文本列(请参阅包含的屏幕截图)
    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 2018-05-16
    • 2014-10-17
    • 2013-06-25
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多