保存哈希以序列化 mysql 中的哈希列但出现错误
saving a hash to serialize Hash column in mysql but getting error
我有一个 Rails 3.2.19 应用程序,它具有以下 class:
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 表示形式,当它从数据库中取出时就变成了一个哈希。为什么 rails 会生成此更新语句,我该如何修复它?
编辑#1
我猜您要序列化的属性的列类型是 String
。
改成Text
,rails就可以进行YAML的转换,然后序列化了。
我很确定问题出在 update_column
而不是您代码中的任何其他问题。 update_column
不适用于 rails issues.
中记录的序列化属性
如果您需要设置值 after_save
您可能需要自己转换为 yaml:
self.update_column(:mig_serializer_frag, a.to_yaml)
我有一个 Rails 3.2.19 应用程序,它具有以下 class:
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 表示形式,当它从数据库中取出时就变成了一个哈希。为什么 rails 会生成此更新语句,我该如何修复它?
编辑#1
我猜您要序列化的属性的列类型是 String
。
改成Text
,rails就可以进行YAML的转换,然后序列化了。
我很确定问题出在 update_column
而不是您代码中的任何其他问题。 update_column
不适用于 rails issues.
如果您需要设置值 after_save
您可能需要自己转换为 yaml:
self.update_column(:mig_serializer_frag, a.to_yaml)