ruby-on-railsrubyrails-activerecordcyclic-referencefabrication-gem

Fabrication gem cyclic dependency


I've got a cyclic dependency when worked with fabrication gem. Here I'll show you what I've did. Let's suppose I have 2 models:

class User < AR::Base
  has_many :messages


class Message < AR::Base
  belongs_to :user

So, the fabricators for them will be:

Fabricator(:user) do
  # bla-bla-bla
  messages(count: 5)
end

Fabricator(:message) do
  # bla-bla-bla
  user
end

It seems all right, yeah? But when I run Fabricate(:user) or Fabricate(:message) I get cyclic dependencies, because of fabricating of message fabricates new user, fabricating new user fabricates a messages for him and so on. How can I avoid this diabolic circle?


Solution

  • I would typically have two user fabricators in an instance like this.

    Fabricator(:user)
    
    Fabricator(:user_with_messages, from: :user) do
      messages(count: 5)
    end
    

    You could alternatively do this to make what you have work.

    Fabricator(:user) do
      messages(count: 5) { Fabricate.build(:message, user: nil) }
    end
    

    The messages will be saved automatically by AR when the user is saved. It will handle setting up the correct references.