ruby-on-rails - rails - factorybot gem
Chica de fábrica con campo serializado (1)
En su fábrica, no debe configurar el cache
al valor serializado, sino al valor real.
FactoryGirl.define do
factory :series1_episodes, :class => Tvdb do
term ''episodes_79488''
cache ["foo", "bar"]
end
end
Tengo este problema con una chica de la fábrica donde me da un undefined method ''each'' for #<String:0x0000012915bc18>
error undefined method ''each'' for #<String:0x0000012915bc18>
con un campo serializado que viene de fábrica.
dentro de ActiveRecord, ejecuta cada uno sin problemas, ya que el objeto devuelto es una matriz.
Mi pregunta es: ¿cómo debo formatear el objeto serializado en mi fábrica? La forma en que el registro activo lo devuelve? o la forma en que se almacena realmente en la base de datos? (es decir, serializado o no?) ¿Rspec hará la misma serialización mágica al guardar y recuperar ese registro activo?
esta es una versión simplificada de lo que estoy haciendo:
Tvdb.rb-- Modelo
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
Entonces en mi modelo de Series.rb puedo hacer esto:
class Series < ActiveRecord::Base
def episodes
episodes = Tvdb.episodes(self.tvdb_id)
episodes.each do |episode|
puts episode.name
end
end
end
Tvdb.rb - Fábrica
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
nota: la sintaxis del valor de caché puede no ser válida aquí, traté de acortar lo que era un objeto serializado muy largo. El punto es que funciona en mi modelo, pero no en rspec
y en mi * series_spec.rb * llamando a esto:
series.episodes.count.should_not == 0
da ese error
undefined method ''each'' for #<String:0x0000012915bc18>