Posted about 9 years ago. Visible to the public. Repeats.
Pitfall: ActiveRecord callbacks: Method call with multiple conditions
In the following example the method update_offices_people_count
won't be called when office_id
changes, because it gets overwritten by the second line:
Copyafter_save :update_offices_people_count, :if => :office_id_changed? # is overwritten … after_save :update_offices_people_count, :if => :trashed_changed? # … by this line
Instead write:
Copyafter_save :update_offices_people_count, :if => :office_people_count_needs_update? private def office_people_count_needs_update? office_id_changed? || trashed_changed? end
Or, move the conditions into the callback. This also allows you test the conditions more easily using a unit test:
Copyafter_save :update_offices_people_count private def update_offices_people_count if office_id_changed? || trashed_changed? ... end end
Also see the card on testing conditional validations.
Your development team has a full backlog of feature requests, chores and refactoring coupled with deadlines? We are familiar with that. With our "DevOps as a Service" offering, we support developer teams with infrastructure and operations expertise.