2011-11-26 3 views
2

У меня возникла проблема с заводской девушкой, где она дает мне ошибку 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> 

ответ

5

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

FactoryGirl.define do 
    factory :series1_episodes, :class => Tvdb do 
    term 'episodes_79488' 
    cache ["foo", "bar"] 
    end 
end 
Смежные вопросы