【问题标题】:rails serialize not saving as a hashrails序列化不保存为哈希
【发布时间】: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


【解决方案1】:

我想将一个字段序列化为哈希

我看到您尝试将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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 2018-05-16
    • 2013-06-25
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多