Io ho avuto problemi in due casi:
1) Il valore del campo deve essere unico all'interno del DB (es: username, email, ecc.). Tale controllo va fatto sia durante la creazione (ovvio), sia durante la modifica (se l'utente in fase di modifica dello "username" ne sceglie uno già esistente la procedura deve restituire un errore). Non si può quindi sfruttare la clausola "on". Ho dovuto quindi ricorrere ad un metodo personalizzato: ho fatto l'override in "AppModel" nella cartella "App" del metodo "isUnique"...
/**
* False if any fields passed match any (by default, all if $or = false) of their matching values.
*
* @param array $fields Field/value pairs to search (if no values specified, they are pulled from $this->data)
* @param boolean $or If false, all fields specified must match in order for a false return value
* @param boolean $notThis If true and $or is false, current record not matchs specified fields.
* @return boolean False if any records matching any fields are found
* @access public
*/
function isUnique($fields, $or = true, $notThis = true) {
if (!is_array($fields)) {
$fields = func_get_args();
if (is_bool($fields[count($fields) - 1])) {
$or = $fields[count($fields) - 1];
unset($fields[count($fields) - 1]);
}
}
foreach ($fields as $field => $value) {
if (is_numeric($field)) {
unset($fields[$field]);
$field = $value;
if (isset($this->data[$this->alias][$field])) {
$value = $this->data[$this->alias][$field];
} else {
$value = null;
}
}
if (strpos($field, '.') === false) {
unset($fields[$field]);
$fields[$this->alias . '.' . $field] = $value;
}
}
if ($notThis && $this->id) {
$fields[$this->name.'.id'] = '<> '.$this->id;
}
if ($or) {
$fields = array('or' => $fields);
}
return ($this->find('count', array('conditions' => $fields)) == 0);
}
Dove la parte aggiunta è quella relativa al parametro "notThis" 
2) Un campo è obbligatorio se un altro è valido (ad esempio un checkbox). Anche qui sono ricorso ad un metodo personalizzato in "AppModel":
/**
* Verifica che il valore del campo sia impostato se lo è anche
* quello del campo passato come secondo parametro.
*/
function __validIf($data, $fieldName) {
$value = array_values($data);
if (!empty($this->data[$this->name][$fieldName])) {
return !empty($value[0]);
}
return true;
}
Spero possano tornarvi utili 