La Coctelera

Apuntes prestados

En el parque somos mayoría

14 Diciembre 2007

Cuidadín con la opción :finder_sql del has_many de ActiveRecord...

... porque para que funcione correctamente tenemos que pasarle la consulta como una cadena entre apóstrofes (o comillas simples).

Así figura en su ejemplo dentro de la documentación de la API, pero cualquier despistado (como por ejemplo yo) podría poner la cadena entre comillas dobles. Si así lo hacemos y dentro hacemos uso de la clave principal del registro actual (con algo como "... WHERE post_id = #{id} ...") la consulta resultante tendrá en su lugar el identificador del objeto Ruby.

Por lo menos eso me ha pasado a mí esta tarde y me he vuelto loco hasta que he descubierto el origen del problema.

No me enrollo más que ya llego tarde a la super cañas-cena-party de los Cocktail Workers.

¡A disfrutar de la/s fiesta/s!

servido por Fernando 3 comentarios compártelo

3 comentarios · Escribe aquí tu comentario

Fernando García Samblas

Fernando García Samblas dijo

Lo he probado también en casa con Rails 2.0.1 y ocurre lo mismo.

18 Diciembre 2007 | 02:30 AM

Fernando García Samblas

Fernando García Samblas dijo

Lógico que pase también con Rails 2.0.1: pasará siempre ya que el hecho de que se interprete la cadena a ese nivel tiene que ver con Ruby y no con Rails.

Jugando un poco más me he dado cuenta de algo obvio: la cadena forma parte de la definición de la clase y por lo tanto se interpreta durante la carga de la misma.

El identificador que nos coloca en la consulta no es el de una instancia del modelo (como pensaba) sino el de la instancia de la clase que está utilizando Ruby para cargar la definición del modelo.

19 Diciembre 2007 | 11:26 AM

cientifico

cientifico dijo

Tener cuidado de usar comillas simples o dobles.

Al usar comillas dobles el id se almacena como parte más del finder_sql en el momento de la carga. Sin embargo si se usan comillas simples la evalucación se hace en tiempo de búsqueda por lo que tomaría, correctamente, el id del objecto con el que estemos trabajando.

has_many :subscribers, :class_name => "Person", :finder_sql =>
'SELECT DISTINCT people.* ' +
'FROM people p, post_subscriptions ps ' +
'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +
'ORDER BY p.first_name'

23 Mayo 2008 | 04:52 PM

Escribe tu comentario


Sobre mí

Avatar de Fernando

Apuntes prestados

España
ver perfil »
contacto »

Blog semestral sólo más personal que experimental de Fernando García Samblas.

Algo hay en la belleza [*] que le impide pasar sin rozar.

[*] "La ruina del amo execrable. Crónicas de Thomas Covenant el Incrédulo." de Stephen R. Donaldson


Fotos

Fernando García Samblas todavía no ha subido ninguna foto.

¡Anímale a hacerlo!

Buscar

suscríbete

Selecciona el agregador que utilices para suscribirte a este blog (también puedes obtener la URL de los feeds):

¿Qué es esto?

Crea tu blog gratis en La Coctelera