2016-06-15 2 views
0

У меня есть две модели с простой has_many ассоциацииРельсы Fabrication камень объединение создает множество объектов

class Usuario < ActiveRecord::Base 
    has_many :publicaciones, dependent: :destroy 
end 

class Publicacion < ActiveRecord::Base 
    belongs_to :usuario, dependent: :destroy 
    validates_presence_of :usuario 
end 

И вот переработчиков

Fabricator(:usuario_con_10_publicaciones) do 
    nombre { FFaker::NameMX.name } 
    publicaciones(count: 10) 
end 

Fabricator(:publicacion) do 
    texto { FFaker::Lorem.paragraphs } 
    usuario 
end 

Когда я использую второй он прекрасно работает, он создает одинPublicacion и одинUsuario

> a = Fabricate :publicacion 
> Usuario.count 
=> 1 
> Publicacion.count 
=> 1 

Но когда я использую первый, он создает десятьPublicaciones но одиннадцатьUsuarios, со всеми Publicaciones, связанные только с последним.

> u = Fabricate :usuario_con_10_publicaciones 
> Usuario.count 
=> 11 
> Publicacion.count 
=> 10 

Не должно создать только один Usuario и десятьPublicaciones?

Благодарим за помощь.

ответ

1

Стив прав о том, что происходит. Другим решением является подавление создания usario в publicaciones.

Fabricator(:usuario_con_10_publicaciones) do 
    nombre { FFaker::NameMX.name } 
    publicaciones(count: 10) { Fabricate.build(:publicacion, usuario: nil) } 
end 

ActiveRecord будет надлежащим образом связывать их для вас, когда дерево сохраняется.

0

Проблема заключается в том, что при создании usario он создает 10 publicacionesно каждый publicaciones изготовление создает один usario

Вы можете использовать переходные процессы для подавления создания по умолчанию новых usario записей.

Fabricator(:usuario_con_10_publicaciones) do 
    nombre { FFaker::NameMX.name } 
    publicaciones(count: 10) { Fabricate(:publicacion, no_usario: true) } 
end 

Fabricator(:publicacion) do 
    transient :no_usario 
    texto { FFaker::Lorem.paragraphs } 
    usuario { |attrs| Fabricate(:usario) unless attrs[:no_usario] } 
end 
+0

Спасибо за помощь, с помощью переходных процессов - хорошая идея, проблема с вашим предложением состоит в том, что неверно создавать 'Publicacion' без' Usuario'. Это решается с помощью 'Fabricate.build' вместо этого, как показано в ответе Пола Эллиотта. – 1087427

Смежные вопросы