2016-06-15 65 views
0

我有兩個型號,一個簡單的has_many協會Rails的製造寶玉石協會創建多個對象

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 

但是當我使用的第一個,它會創建 PublicacionesUsuarios,只有用最後一個相關聯的所有Publicaciones

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

難道不應該只創建一個UsuarioPublicaciones

感謝您的幫助。

回答

1

史蒂夫是正確的發生了什麼事情。另一種解決方案是抑制在publicaciones中創建usario

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

當持久樹時,ActiveRecord會正確地將它們關聯起來。

0

的問題是,當你創建usario它創建10 publicacionespublicaciones製造創建一個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

感謝您的幫助,使用瞬變是一個好主意,與您的建議相關的問題是,沒有'Usuario'創建'Publicacion'是無效的。這可以用'Fabricate.build'來解決,如Paul Elliott的答案所示。 – 1087427