When source is nil, validation will fail, right? Even source is not nil, but source_type or source_id is nil, validation  on source still fails. Also I think it should be 

    validates_presence_of :source_id, :source_type, :if => :source_must_be_exist?

Not `:unless` if we were to put it back.