我想将字段序列化为哈希,但出于某种原因,它将其保存为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
基于列名,其中一个导致了这个问题。
答案 0 :(得分:0)
我想将字段序列化为哈希
我看到您尝试将MySQL
与NoSQL
混合以实现良好的序列化。所以我的答案将针对该任务进行说明,但仅适用于PostgreSQL
数据库。我建议您使用gem hstore在数据库中存储哈希的替代方法。声明和用法如下:
class Classification
serialize :dynamic_fields, ActiveRecord::Coders::Hstore
end
c = Classification.new
c.dynamic_fields = { '0' => {'field'=>'a','type'=>1}, '1' => {'field'=>'b','type'=>2} }
c.dynamic_fields['0'] # => {'field'=>'a','type'=>1}