has_and_belongs_to_many associations

Generating data for a has_and_belongs_to_many relationship is very similar to the above has_many relationship, with a small change: you need to pass an array of objects to the model's pluralized attribute name rather than a single object to the singular version of the attribute name.

def profile_with_languages(languages_count: 2)
  FactoryBot.create(:profile) do |profile|
    FactoryBot.create_list(:language, languages_count, profiles: [profile])
  end
end

Or with the callback approach:

factory :profile_with_languages do
  transient do
    languages_count { 2 }
  end

  after(:create) do |profile, context|
    create_list(:language, context.languages_count, profiles: [profile])
    profile.reload
  end
end

Or the inline association approach (note the use of the instance method here to refer to the profile being built):

factory :profile_with_languages do
  transient do
    languages_count { 2 }
  end

  languages do
    Array.new(languages_count) do
      association(:language, profiles: [instance])
    end
  end
end