Validates the current record object to make sure it is ok to commit to the database.  If
        the optional override dictionary is passed in, then it will use the given values vs. the one
        stored with this record object which can be useful to check to see if the record will be valid before
        it is committed.

        :param      overrides | <dict>

        :return     <bool>

def validate(self, columns=None):
        """
        Validates the current record object to make sure it is ok to commit to the database.  If
        the optional override dictionary is passed in, then it will use the given values vs. the one
        stored with this record object which can be useful to check to see if the record will be valid before
        it is committed.

        :param      overrides | <dict>

        :return     <bool>
        """
        schema = self.schema()
        if not columns:
            ignore_flags = orb.Column.Flags.Virtual | orb.Column.Flags.ReadOnly
            columns = schema.columns(flags=~ignore_flags).values()
            use_indexes = True
        else:
            use_indexes = False

        # validate the column values
        values = self.values(key='column', columns=columns)
        for col, value in values.items():
            if not col.validate(value):
                return False

        # valide the index values
        if use_indexes:
            for index in self.schema().indexes().values():
                if not index.validate(self, values):
                    return False

        return True