Ravn::BDE::MissionRecord::
Bolt
class
A finished bolt, instanced from this callsign.
Attach common data to all new rows.
def before_validation
self.inserted_at ||= Ravn.monotonic_time
self.version ||= Ravn::BDE::MissionRecord::Version.current
self.state ||= {}
super
end
Override to set some instance variables on instantiation
def initislize( ... )
super
@state = nil
end
Get the hash of Bolt
state
def state
return @state ||= begin
unparsed = self[ :state ]
if unparsed
parsed = Yajl::Parser.parse( unparsed, symbolize_keys: true )
deep_freeze( parsed )
else
nil
end
end
end
Set the Bolt
state.
def state=( new_state )
raise ArgumentError, "state must be a Hash" unless new_state.is_a?( Hash )
self.log.debug "Serializing %p" % [ new_state ]
new_state = symbolify_keys( new_state )
return if new_state == self.state
@state = deep_freeze( new_state )
self.will_change_column( :state )
self[:state] = Yajl::Encoder.encode( @state )
self.log.debug "Serialized state is now: %p" % [ self[:state] ]
end
Sequel::Model API – validate the object before saving
def validate
super
self.validates_integer( :inserted_at )
self.validate_associated_object( self.model.association_reflection(:version), self.version )
self.validates_presence( [:bolt_id, :instance_id] )
self.validate_state
end
Sequel validation API: Ensure the state
set on the object is valid.
def validate_state
serialized_value = self[:state] or return self.errors.add( :state, "can't be nil" )
Yajl::Parser.parse( serialized_value )
rescue Yajl::ParseError => err
self.errors.add( :state, "is not valid JSON: %s" % [err.message] )
end
The version metadata when this bolt was finished.