El día 26 de marzo de 2010 03:57, NachoKB <[email protected]> escribió:
> Estimados,
>   tengo un caso frente al que me quede sin ideas prácticamente.
>
>   Simplificando, tengo un model User que tiene una validación de uniqueness
> sobre el atributo login. Ahora bien, debido a que la unica forma de
> garantizar unicidad es con un index unique en la base, lo agregué
> (básicamente, ActiveRecord no puede garantizar la unicidad por un tema de
> concurrencia).
>
>   Ahora mi problema es que la registración de usuario tiene dos pasos
> (primero se crea y luego se verifica). Mi problema es que necesitaría que no
> valide como erroneo en el caso que exista otro usuario con el mismo login,
> pero estando ese usuario aun no activado (digamos "pendiente"). O sea,
> quisiera que la verificación de existencia la realice no sobre toda la
> tabla, sino, por ejemplo, usando un named_scope.
>
>   Rápidamente cree un método "validates_uniqueness_of_with_named_scope" para
> que la verificación del "exists?" la realice sobre un named scope (si fue
> especificado), idéntico en todo lo demás al "validates_uniqueness_of"
> standard, y funcionó bárbaro.
>
>   Por supuesto, en este caso aunque el validates sea correcto, la base de
> datos detecta duplicación por el index unique...
>
>   No se me ocurre manera de soportar este caso sin perder el resguardo del
> index unique... ¿alguna idea? ¿cómo lo hacen?
>
>   Perdón la longitud para explicar algo tan simple :D.

La verdad, de lo poco que se entiende, te puedo decir que haría un
índice único con la combinación de usuario y algún otro campo que te
garantice unicidad solamente en usuario validado. Con postgresql podés
hacer varias cosas con triggers o índices funcionales, pero más fácil
es tener un campo que se llame por_validar que valga cero cuando está
validado y un incremental de los que aún están en proceso.

Silvio

-- 
Silvio Quadri
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a