Se você gerar um modelo pelo Gii, normalmente os caras "safe" são aqueles atributos que não tiveram nenhum tipo de validação. Sinceramente ainda não entendi a real funcionalidade disto. Qual o sentido de marcar um atributo ignorado como "safe"? Por que eu iria me preocupar com ele em um cenário de save() batch por exemplo.
Até o momento utilizo o "safe" apenas em atributos que insiro no formulário de pesquisa. Em minhas experiências não encontrei um sentido em usá-lo num scenario diferente do "search", por exemplo, definir "safe" para scenarios como "insert e update" ou qualquer outro da mesma natureza, mas se vc realmente confia no usuário vc poderá fazer dessa forma, porém colocará em risco a entrada desse dado no bd.
Alerto que o safe deve ser utilizado com prudência. Quando um atributo é definido como “safe” sem um scenario esse dado estará pronto para entrar no bd quando a atribuição em massa “$model->attributes = $_POST[‘Classe’];” acontecer, ou seja, a validação irá ignorar o atributo.
O "unsafe", como o tópico citado diz, "é uma exceção" e eu nem imagino uma exceção do tipo. Lembrando que na utilização desse cara, as atribuições em massa irão ignorar o atributo de acordo com o scenario, se vc deseja passar esse valor para a classe terá que fazer a atribuição direta. Exemplo:
public function rules(){
return array(
array('nome', 'unsafe', 'on'=>'insert')
);
}
public function actionCreate(){
.
.
$model->attributes = $_POST ou $GET;
$model->nome = $_POST['Classe']['atributo'];
.
.
}
Pois é, então meu raciocínio em torno dos validadores “safe” está de acordo com o de vocês. Realmente é algo que não faz muito sentido utilizar, talvez para quem queira um pouco mais de “flexibilidade” em validar regras em testes de integração.