Ruby on Rails 3 - Сериализация массива с несовпадением классов - PullRequest
1 голос
/ 01 марта 2011

Привет, Я озадачен этой проблемой несоответствия сериализации в Rails 3.0.5 и Ruby 1.9.2. Я заполняю базу данных подклассом Array, а затем пытаюсь сохранить объект ActiveRecord. Кто-нибудь может мне помочь, пожалуйста! Сначала я пытался сериализовать как Graph, но сократил его до Array, чтобы избежать ошибок с пользовательским классом. Я очень озадачен, поскольку это не имеет для меня интуитивного смысла. Большое спасибо за вашу помощь!

class Graph < Array
  ..

class Settings < ActiveRecord::Base
  serialize :graphs, Array
  ..

Самые последние строки в seed.rb - например, ничего не происходит после. Просто сохранив много для отладки:

  sh_1g = sh_1g.to_a
  d.company.settings.add_graph(sh_1g.to_a)
  d.company.settings.save!
  d.company.save!  
  d.save!
  if sh_1g == d.company.settings.graphs[0]
    puts "the added graph matches the first graph in the graphs array"
  end
  puts "added " + sh_1g.inspect + " to " + d.company.settings.graphs.inspect
  puts "class of added graph as saved is" + d.company.settings.graphs[0].class.inspect
  puts "class of added graph is " + sh_1g.class.inspect
  puts "class of graphs serial is " + d.company.settings.graphs.class.inspect

Вывод файла seed.rb при запуске:

the added graph matches the first graph in the graphs array
added [[[0, 0, ..]]] to to [[[[0, 0, ..]]]..]
class of added graph as saved isArray
class of added graph is Array
class of graphs serial is Array

Однако в консоли:

ruby-1.9.2-p180 :002 > Company.all[1].settings
ActiveRecord::SerializationTypeMismatch: graphs was supposed to be a Array, but was a String
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/attribute_methods/read.rb:106:in `unserialize_attribute'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/attribute_methods/read.rb:82:in `read_attribute'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/base.rb:1586:in `attribute_for_inspect'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/base.rb:1667:in `block in inspect'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/base.rb:1665:in `collect'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/base.rb:1665:in `inspect'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/associations/association_proxy.rb:146:in `inspect'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
    from /Users/dlipa/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Ответы [ 2 ]

1 голос
/ 07 июля 2011

У меня была проблема, похожая на эту. Моя проблема возникла из-за размещения моего serialize :some_column, Array заявления. Если по какой-то причине методы атрибутов в вашем объектном классе ActiveRecord будут определены до того, как вы вызовете serialize, у вас не будет правильно заданных методов setter и getter.

Итак, я бы удостоверился, что define_attribute_methods не вызывается в вашем классе настроек, прежде чем вы объявите, какие столбцы сериализуются.

0 голосов
/ 05 марта 2011

установите параметр

:null => true

в вашей миграции для поля "графики".Это исправляет эту ошибку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...