#Programming #Ruby #WebDevelopment # Learned Lessons ## Using `after(:create)` vs. `after(:build)` If you add a trait that augments a hash inside an object generated with FactoryBot like so: ```ruby FactoryBot.define do factory :employee do employer name { "Jake Peralta" } attributes { { "sense_of_humor": "childish" } } trait :married do after(:create) do attributes["spouse"] = "Amy Santiago" end end end end ``` When unit testing with a parent object like so (assume the underlying models exist and that an employer has many employees): ```ruby employer = create(:brooklyn_99th_precinct) jake = create(:employee, :married, employer: employer) ``` If you call `employer.employee.first.attributes` at this point, you might be surprised at the result: ```json { "sense_of_humor": "childish" } ``` If this happens to you, it's because you used the wrong hook. You should be using: ```ruby trait :married do after(:build) do attributes["spouse"] = "Amy Santiago" end end ``` Now you will see: ```json { "sense_of_humor": "childish", "spouse": "Amy Santiago" } ``` This is because the `after(:build)` hook occurs before persistence, whereas `after(:create)` happens *after* persistence. If you are constrained to use the `after(:create)` hook, then make sure to explicitly persist the object after it is created by the factory: ```ruby jake.save! ```