2011-11-26 102 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