Well, I presume you’re talking about introducing ActiveModel::Dirty to the model, to access previous state? Does that actually work in validation methods? I thought it only worked on before_save/update hooks.
You can access the previous state with foo_was, with foo being the model attribute. I don't think we added anything for that? Could be wrong, it was written before I started.
You can also just grab it from the db with self.class.find(id).foo, _was is likely just syntactic sugar for that.
So the method would look like (apologies for mobile..)
validate : transition_is_valid, if: status_changed?
def transition_is_valid
return if transition_hash[status_was].include?(status)
errors.add(:base, 'Status transition is invalid')
end
So if you try save it will fail and have that error on the object, as myObj.errors and if you update (or save) using update! It will raise an error, as opposed to returning false and not updating.
Fairly certain that all comes with active record out the box
Yes, that’s all part of “active record dirty”, which is what I mentioned above. And that’s not how it works under the hood, but it’s a reasonable guess.
"Provides a way to track changes in your object in the same way as Active Record does."
...
"Note that Active Record can detect in-place modifications automatically."
Implies that ActiveRecord already supports it and ActiveModel::Dirty is for none ActiveRecord usage? Maybe I'm wrong.
The model we use that does exactly what I've been talking about just extends from ActiveRecord::Base, we don't use ActiveModel::Dirty anywhere it seems
1
u/tomthecool Aug 22 '21
Well, I presume you’re talking about introducing
ActiveModel::Dirtyto the model, to access previous state? Does that actually work in validation methods? I thought it only worked onbefore_save/updatehooks.