ActiveRecord - find_by v / s donde

¿Cuál es la diferencia entre las construcciones de rieles?

authentication = Authentication.where(:provider=>omniauth['provider'], :uid=>omniauth['uid'])
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])

Mi problema es que si utilizo la primera construcción (.where), no puedo obtener la asociación. Mi modelo de autenticación "pertenece al" usuario del modelo. Si busco la autenticación usando la primera construcción, no puedo obtener el usuario asociado a través de: authentication.user, pero lo mismo funciona con la segunda versión.

Quiero usar la primera construcción en lugar de la segunda debido al problema de Heroku: http://docs.heroku.com/database : PGError: ERROR: el operador no existe: carácter variable = entero.

preguntado el 08 de enero de 11 a las 17:01

También estoy usando heroku y el segundo funciona bien. ¿Su proveedor y uid están en tipo de cadena? -

uid es varchar pero cuando se compara por números, obtengo el error de Postgres. Estoy usando el método de autenticación omniauth. No estoy seguro de como arreglar esto -

tal vez llamar .to_s en omniauth ['uid'], por lo que los rieles piensan que es una cadena y la pasan a postgres como varchar. -

@adrian - eso funciona ... Muchas gracias. -

Publiqué un comentario como otra respuesta. márquelo como correcto para que otros puedan saber que esto está resuelto :) -

2 Respuestas

PGError: ERROR: el operador no existe: carácter variable = entero.

No es un problema de heroku. Postgresql desde 8.4 o 8.3 introdujo una verificación de tipos más restrictiva. Por ejemplo, si su columna "posición" es un número entero, no puede escribir este sql:

select * from orders where position = '1';

Devolverá un error similar al tuyo.

Tu podrías intentar:

auth = Authentication.find :all, :conditions => ["provider = ? and uid = ?", provider, uid]

Respondido el 17 de junio de 14 a las 13:06

Esto también falla. Cuando hago auth.user.email, obtengo: NoMethodError (método indefinido `usuario 'para # ), Creo que el valor devuelto es una matriz y no un objeto de autenticación. - Ved

Vuelva a publicar una buena respuesta de los comentarios:

tal vez llamar .to_s en omniauth ['uid'], por lo que los rieles piensan que es una cadena y la pasan a postgres como varchar.

Respondido el 08 de enero de 11 a las 20:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.