Rails 制造 gem 关联创建许多对象

Rails Fabrication gem association creating many objects

我有两个具有简单 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

当我使用第二个时,它工作正常,它创建 one Publicacionone Usuario

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

但是当我使用第一个时,它创建了 ten Publicaciones 但是 eleven Usuarios,所有 Publicaciones 只与最后一个关联。

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

它不应该只创建 一个 Usuario Publicaciones?

感谢您的帮助。

问题是,当你创建 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

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

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

当树被持久化时,ActiveRecord 会正确地为你关联它们。