I am sure that all validate_* methods can take a parameter :if , which can point to another method (and probably also take Proc), so you can expand your checks to be more than like:
validates_presence_of :paid_at, :if => :paid? validates_association :purchaser, :if => :paid?
To clear further, there is a with_options helper:
with_options :if => :paid? do |v| v.validates_presence_of :paid_at v.validates_association :purchaser end
Not sure if any of them can be used with the standard validate :custom_validate_method , though, but that won't surprise me.
source share