Фабричная девушка с сериализованным полем - PullRequest
2 голосов
/ 26 ноября 2011

У меня проблема с заводской девушкой, из-за которой возникает ошибка undefined method 'each' for #<String:0x0000012915bc18> с сериализованным полем, поступающим с завода.

в ActiveRecord, он запускает каждый без проблем, так как возвращаемый объект является массивом.

Мой вопрос: как мне отформатировать сериализованный объект на моей фабрике? То, как активная запись возвращает его? или как это на самом деле хранится в базе данных? (т. е. сериализовано или нет?) rspec будет выполнять ту же магию сериализации при сохранении и извлечении, что делает активная запись?

это упрощенная версия того, что я делаю:

Tvdb.rb-- Модель

class Tvdb < ActiveRecord::Base

  set_table_name 'tvdb'
  serialize :cache

  def self.episodes(id)
    cached = self.find_by_term('episodes_' + id.to_s)
    return cached.cache unless cached.nil?

    info = self.series_info(id)
    request = info.episodes

    Tvdb.create(:term=>'episodes_' + info.id.to_s, :cache=>request)
    return request
  end
end

Тогда в моей модели Series.rb я могу сделать это:

class Series < ActiveRecord::Base

  def episodes
    episodes = Tvdb.episodes(self.tvdb_id)
    episodes.each do |episode|
      puts episode.name
    end
  end

end

Tvdb.rb - Завод

FactoryGirl.define do
  factory :series1_episodes, :class=>Tvdb do
    term 'episodes_79488'
    cache %q([#<AnObject::Module:0x000001290a4568 @value="dsada"]>,#<AnObject::Module:0x0002321290a4568 @value="dsadsada"]> )
  end  
end

примечание: синтаксис значения кэша может быть здесь недействительным, я попытался сократить очень длинный сериализованный объект. Дело в том, что он работает в моей модели, а не в rspec

и в моем * series_spec.rb * это называется:

series.episodes.count.should_not == 0

дает эту ошибку

undefined method 'each' for #<String:0x0000012915bc18>

1 Ответ

5 голосов
/ 27 ноября 2011

На вашем заводе вы не должны устанавливать cache на сериализованное значение, но на фактическое значение.

FactoryGirl.define do
  factory :series1_episodes, :class => Tvdb do
    term 'episodes_79488'
    cache ["foo", "bar"]
  end
end
...