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.
makandra has been working exclusively with Ruby on Rails since 2007. Our laser focus on a single technology has made us a leader in this space.