Pregunta

Estoy realizando una operación de búsqueda de ActiveRecord (a través de la biblioteca " will_paginate ") de esta manera:

  contacts = Contact.paginate(:all,
    :conditions => conditions_specified,
    :select => "DISTINCT contacts.*",
    :joins => joins,
    :include => [:addresses, :emails, :phone_numbers, {:addresses => :organization}],
    :page => page,
    :per_page => @@PAGE_SIZE,
    :order => 'last_name, first_name, middle_name')

En la consola, obtengo el resultado que se muestra a continuación. Al establecer el parámetro include , espero que esto resulte en una sola consulta. Pero en la salida estoy viendo muchas consultas. Por ejemplo, me sorprende ver la línea ...

  Address Load (2.5ms)   SELECT `addresses`.* FROM `addresses` WHERE (`addresses`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))

en la salida de abajo. (Entiendo que las consultas SHOW FIELDS FROM se almacenan en caché en la producción, por lo que no es un problema. Es todo lo que tengo que SELECTS extra).

Processing ContactController#index (for 127.0.0.1 at 2009-01-03 21:21:18) [GET]
  Session ID: d453897c2f67c29c9a68d3fbc7b94f7b
  ContactSearch Columns (4.4ms)   SHOW FIELDS FROM `contact_searches`
  Contact Load (1.1ms)   SELECT DISTINCT contacts.* FROM `contacts` WHERE (contacts.last_name LIKE '%n%') ORDER BY last_name, first_name, middle_name LIMIT 0, 35
  Contact Columns (2.3ms)   SHOW FIELDS FROM `contacts`
  Address Load (2.5ms)   SELECT `addresses`.* FROM `addresses` WHERE (`addresses`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))
  Address Columns (2.7ms)   SHOW FIELDS FROM `addresses`
  Email Load (1.7ms)   SELECT `emails`.* FROM `emails` WHERE (`emails`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))
  Email Columns (1.8ms)   SHOW FIELDS FROM `emails`
  PhoneNumber Load (3.3ms)   SELECT `phone_numbers`.* FROM `phone_numbers` WHERE (`phone_numbers`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))
  PhoneNumber Columns (3.0ms)   SHOW FIELDS FROM `phone_numbers`
  Organization Columns (2.9ms)   SHOW FIELDS FROM `organizations`
  Organization Load (0.9ms)   SELECT * FROM `organizations` WHERE (`organizations`.`id` IN (99,116,44,6,23,78,107,91,79,119,14,120,71,26,59,94,27,100,62,1,51,29,30,2,65,76,5))
Rendering template within layouts/main
Rendering contact/index
Rendered contact/_field_function_specifier (0.9ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_search_form (14.1ms)
Rendered contact/_quick_view_contact_info (3.2ms)
Rendered contact/_quick_view_contact_info (2.1ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Rendered contact/_quick_view_contact_info (0.8ms)
Rendered contact/_quick_view_contact_info (2.0ms)
Rendered contact/_quick_view_contact_info (2.4ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (1.4ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (2.2ms)
Rendered contact/_quick_view_contact_info (1.5ms)
Rendered contact/_quick_view_contact_info (2.0ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (1.8ms)
Rendered contact/_quick_view_contact_info (3.6ms)
Rendered contact/_quick_view_contact_info (2.2ms)
Rendered contact/_quick_view_contact_info (2.2ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (2.0ms)
Rendered contact/_quick_view_contact_info (2.1ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Completed in 308ms (View: 104, DB: 27) | 200 OK [http://localhost/contact]
¿Fue útil?

Solución

Hice un poco más de investigación y encontré la respuesta. Estoy actualizando esto para aquellos que busquen más tarde. La respuesta larga está en esta publicación de blog .

Parece que cuando hace una búsqueda que tiene ambas combinaciones y un límite, ActiveRecord debe consultar primero la tabla principal para obtener los ID de las filas para regresar, luego rehacer la consulta usando solo los ID para aplicar el límite.

Desde que estaba usando will_paginate , eso es lo que sucedió cuando will_paginate usó limit ed consultas para hacer la paginación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top