【发布时间】:2014-11-27 19:59:12
【问题描述】:
我想将一个字段序列化为哈希,但由于某种原因,它将它保存为 ActiveRecord::Coders::YAMLColumn 而不是 yaml 哈希。
表:
DESCRIBE classifications;
| id | int(11) | NO | PRI | NULL | auto_increment |
| code | varchar(255) | YES | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| dynamic_fields | text | YES | | NULL | |
型号:
class Classification
serialize :dynamic_fields, Hash
end
控制台:
c = Classification.new
c.code = 'some_code'
c.dynamic_fields = { '0' => {'field'=>'a','type'=>1}, '1' => {'field'=>'b','type'=>2} }
=> #<struct ActiveRecord::AttributeMethods::Serialization::Attribute coder=#<ActiveRecord::Coders::YAMLColumn:0x007fa69890fd58 @object_class=Hash>, value="---\n'0':\n field: a\n type: 1\n'1':\n field: b\n type: 2\n", state=:serialized>
我不知道为什么它试图将其保存为 ActiveRecord::Coders::YAMLColumn 而不是 Hash,因为我指定了 Hash 进行序列化。我该如何解决这个问题?
我刚刚发现是什么导致了问题,但不是为什么:
在我的分类模型中,我包含了以下内容:
module MongoidDocumenter
extend ActiveSupport::Concern
included do
all.each do |class_code|
has_many_documents "#{class_code.code.underscore}_field".to_sym
end
end
end
当我将其注释掉时,问题就消失了:
# include MongoidDocumenter
has_many_documents 动态构建方法:
class_eval <<-EOS
def #{ association_name }
klass_name = #{ association_name.to_s.singularize.classify }
klass_name.where(#{ name.underscore }_id: id)
end
EOS
基于列名,其中一个导致了这个问题。
【问题讨论】:
-
答案中尚未指定的内容存在一些问题。
Gemfile.lock可能会有所帮助,但请不要将其直接粘贴到问题中,某种 pastebin 可能会有所帮助。 -
你用的是哪种数据库?
-
@МалъСкрылевъ 我认为它没有任何用处。在给定的示例中,数据甚至没有进入数据库,序列化算法是相同的。
-
@D-side no,我可以提出postgresql的具体方式
-
@D-side 我发现是什么导致了这个问题,但不是为什么
标签: ruby-on-rails