Add per model automatically_define_enum_traits option - #1598
Open
mikespokefire wants to merge 1 commit into
Open
Add per model automatically_define_enum_traits option#1598mikespokefire wants to merge 1 commit into
mikespokefire wants to merge 1 commit into
Conversation
Author
|
Hey @mike-burns, this has been sat for a while. I'm just bumping it, as I'm wondering if there is any interest in solving the underlying issue or not? It's something that would be really useful for our 15 year old code base :-) |
mikespokefire
force-pushed
the
automatically_define_enum_traits-per-model
branch
from
August 4, 2026 15:13
f3e9265 to
ca52bc2
Compare
mikespokefire
requested review from
neilvcarvalho and
vburzynski
as code owners
August 4, 2026 15:13
Currently you can only specify whether to automatically define enum traits at
a global level, through `FactoryBot.automatically_define_enum_traits`.
This means that an entire codebase has to either opt-in, or opt-out
from automatically defining enum traits. If you are in a large,
established codebase with lots of enum's, this is quite hard to change
globally when you find that automatically defining them doesn't fit for
your new use case.
If we could override this at a per-factory level, we could allow
individual factories to override the global setting where appropriate,
in order to do customise them where necessary.
Given `FactoryBot.automatically_define_enum_traits` being set to `true`,
and a model called `Task` with the following enum definition:
```
class Task
enum :confirmed_by, [:user, :organisation], prefix: true
end
```
You would be able to override disable this on a per-factory basis like so:
```
FactoryBot.define do
factory :task, automatically_define_enum_traits: false do
confirmed_by { :user }
trait :org_confirmed do
confirmed_by { :organisation }
end
end
end
```
If `FactoryBot.automatically_define_enum_traits` was instead set to
`false`, then the same model with a factory override set to `true` you
would end up with the following automatic traits:
```
FactoryBot.define do
factory :task, automatically_define_enum_traits: true do
# The :user and :organisation traits below would be automatically
# defined in the following way:
#
# trait :user do
# confirmed_by { :user }
# end
# trait :organisation do
# confirmed_by { :organisation }
# end
end
end
```
Fixes: thoughtbot#1597
Co-Authored-By: Julia Chan <julia.chan@freeagent.com>
mikespokefire
force-pushed
the
automatically_define_enum_traits-per-model
branch
from
August 4, 2026 15:15
ca52bc2 to
b25b722
Compare
Author
|
Hey @neilvcarvalho and @vburzynski, I've updated this today in the hopes it might be considered for merging into upstream FactoryBot? Since I originally created it, we've found some more use cases for this internally. I'd be happy to iterate on this with any feedback too, if you have any. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Currently you can only specify whether to automatically define enum traits at a global level, through
FactoryBot.automatically_define_enum_traits. This means that an entire codebase has to either opt-in, or opt-out from automatically defining enum traits. If you are in a large, established codebase with lots of enum's, this is quite hard to change globally when you find that automatically defining them doesn't fit for your new use case.If we could override this at a per-factory level, we could allow individual factories to override the global setting where appropriate, in order to do customise them where necessary.
Given
FactoryBot.automatically_define_enum_traitsbeing set totrue, and a model calledTaskwith the following enum definition:You would be able to override disable this on a per-factory basis like so:
If
FactoryBot.automatically_define_enum_traitswas instead set tofalse, then the same model with a factory override set totrueyou would end up with the following automatic traits:Fixes: #1597