Rails Fabrication gem association创建许多对象

时间:2016-06-15 21:03:02

标签: ruby-on-rails ruby ruby-on-rails-4 fabrication-gem

我有两个简单has_many关联的模型

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吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

史蒂夫对于正在发生的事情是正确的。另一种解决方案是禁止在usario中创建publicaciones

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

当树持久存在时,ActiveRecord会为您正确关联它们。

答案 1 :(得分: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