Estimado Braulio,
A pesar de que lo que te diré podrá ser tomado como un comentario poco popular, en ocasiones es bueno ir a lo simple en vez de ir por la magia.
Me explico. Si tenemos el modelo cliente, y el de ciudad como indicabas y nos ponemos en 2 escenarios:
1. Con la lista de clientes queremos mostrar el nombre de la ciudad.
2. Con la lista de ciudades, queremos traer la lista de clientes que están en ella.
Lo sencillo, y fácil de entender habría sido usar el simple, pero poderoso find y nada de métodos mágicos. El uso de métodos mágicos nos puede parecer dulce, nos hace sentir cool, pero cuando alguien más tenga que hacer el mantenimiento, intentará buscar el método getCiudad en el modelo de cliente y tendrá que leer todo respecto de activerecord para caer que es parte de la carga automática de relaciones en el modelo.
Por otro lado, con el simple find, la cosa quedará claro ahora y en 3 años más.
Entonces, para resolver el caso 1:
foreach($clientes as $cliente):
$ciudad = (new Ciudad)->find_first('conditions: ciudad_id = ' . $cliente->ciudad_id);
echo $cliente->nombre . PHP_EOL;
echo $ciudad->nombre . PHP_EOL;
endforeach;
Como ves, si alguien usa un IDE como Eclipse, Netbeans, Code con herramientas de Intellisence u otra, al hacer click para ver la documentación de find_first, lo hallará rápidamente.
El segundo escenario es más o menos igual:
foreach($ciudades as $ciudad):
$clientes = (new Cliente)->find('conditions: ciudad_id = ' . $ciudad->id);
echo $ciudad->nombre . PHP_EOL;
foreach($clientes as $cliente):
echo $cliente->nombre . PHP_EOL;
endforeach;
endforeach;
Si te fijas, es simple de leer, y te habrías ahorrado las horas buscando información.
Como bien dicen, usar KISS: Keep it Simply Stupid: Mantenerlo lo más sencillo posible.
Es enemigo del mantenimiento el código demasiado INTELIGENTE. En su defecto, prefieran en lo posible hacer el código con lo básico, aunque parezca tonto decirlo, es mucho mejor y uno ahorra tiempo leyendo código que hizo mucho tiempo antes.
Una cosa más, ahora ni siquiera necesitarás definir el has_many ni el belongs_to, y por tanto tampoco necesitará una explicación extra en el código del modelo.
Un abrazo cordial :-)
Nelson.-