The validation_contexts plugin adds support for a validation_context method inside a validate method. You pass in the validation context to use via the :validation_context option to Sequel::Model#save && Sequel::Model#valid?:
class Album < Sequel::Model plugin :validation_contexts def validate super errors.add(:status_id, 'not 1') if status_id != 1 && validation_context == :initial errors.add(:status_id, 'not 2') if status_id != 2 && validation_context == :approve end end Album.new(status_id: 1).valid?(validation_context: :initial) # => true Album.new(status_id: 2).valid?(validation_context: :initial) # => false Album.new(status_id: 1).valid?(validation_context: :approve) # => false Album.new(status_id: 2).valid?(validation_context: :approve) # => true
There is no validation context used by default, so validation_context will be nil if one is not specified. If you want to differentiate between creating new objects and updating existing objects, just use new?.
Once this plugin is loaded into a model, after you freeze an instance of that model, you can no longer specify a validation context when validating the instance.