rails serialize不保存为哈希

时间:2014-11-27 19:59:13

标签: ruby-on-rails

我想将字段序列化为哈希,但出于某种原因,它将其保存为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

基于列名,其中一个导致了这个问题。

1 个答案:

答案 0 :(得分:0)

  

我想将字段序列化为哈希

我看到您尝试将MySQLNoSQL混合以实现良好的序列化。所以我的答案将针对该任务进行说明,但仅适用于PostgreSQL数据库。我建议您使用gem 在数据库中存储哈希的替代方法。声明和用法如下:

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}