Rails: ¿MetaSearch se rompe cuando se busca y se paginan?
-
26-10-2019 - |
Pregunta
Tengo un conjunto de fotos de búsqueda, y quiero limitar los resultados de la página de índice a las que son públicas (es decir, no pertenecen a una colección privada, también conocida como. :collection_id=>nil
).
Tengo el siguiente alcance en mi modelo:
scope :community, where(:collection_id => nil)
Tengo lo siguiente en mi controlador:
def index
@search = Photo.community.search(params[:search])
@photos = @search.page(params[:page]).per(20)
end
Estoy usando Kaminari para paginar los resultados.
Cuando busco fotos sin cable (es decir, es decir Photo.search(params[:search])
) funciona bien. Sin embargo, cuando busco fotos usando este alcance, la paginación rompe la búsqueda. La primera página aparece correctamente, pero cuando voy a otra página no hay resultados. Para probar esto localmente, cambié la paginación a 1 por página y aún no importa lo que busque en cualquier página después de que la primera página no muestre resultados a pesar de que el paginador indica que hay muchas más páginas de resultados.
No tengo idea de cómo depurar y solucionar esto, y realmente usaría ayuda. Aquí está el SQL del registro de desarrollo:
Para una carga normal de la página de índice (sin búsqueda):
Started GET "/photos" for 127.0.0.1 at 2011-04-28 11:58:51 -0500
Processing by PhotosController#index as HTML
SQL (0.4ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
SQL (0.3ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Context Load (0.3ms) SELECT "contexts".* FROM "contexts" ORDER BY "contexts"."display_order" ASC
Focus Load (0.3ms) SELECT "focus".* FROM "focus" ORDER BY "focus"."display_order" ASC
LandUse Load (0.3ms) SELECT "land_uses".* FROM "land_uses" ORDER BY "land_uses"."display_order" ASC
Rendered static/_help-context.html.haml (4.5ms)
Rendered static/_help-focus.html.haml (3.1ms)
Rendered photos/_search.html.haml (304.9ms)
SQL (0.5ms) SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL LIMIT 1 OFFSET 0
Photo Load (1.0ms) SELECT "photos".* FROM "photos" WHERE "photos"."collection_id" IS NULL LIMIT 1 OFFSET 0
Attachment Load (0.2ms) SELECT "attachments".* FROM "attachments" WHERE ("attachments".photo_id = 1)
User Load (1.0ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1)
Profile Load (1.7ms) SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
Context Load (0.2ms) SELECT "contexts".* FROM "contexts" WHERE "contexts"."id" = 6 ORDER BY "contexts"."display_order" ASC LIMIT 1
Focus Load (0.1ms) SELECT "focus".* FROM "focus" WHERE "focus"."id" = 2 ORDER BY "focus"."display_order" ASC LIMIT 1
LandUse Load (0.2ms) SELECT * FROM "land_uses" INNER JOIN "land_uses_photos" ON "land_uses".id = "land_uses_photos".land_use_id WHERE ("land_uses_photos".photo_id = 1 ) ORDER BY "land_uses"."display_order" ASC
Rendered photos/_photo_tiles.html.haml (62.2ms)
SQL (0.2ms) SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL
Rendered shared/_feedback.html.haml (1.5ms)
Role Load (0.5ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
CACHE (0.0ms) SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
CACHE (0.0ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
Rendered shared/_menu.html.haml (177.6ms)
Rendered shared/_footer.html.haml (2.7ms)
Rendered photos/index.html.haml within layouts/application (897.1ms)
Completed 200 OK in 1158ms (Views: 912.2ms | ActiveRecord: 8.2ms)
Para la primera página de una búsqueda (funciona correctamente):
Started GET "/photos?utf8=%E2%9C%93&search%5Bcontext_id_in%5D%5B%5D=6&search%5Btagged_with%5D=&search%5Btext_contains%5D=&search%5Bnear%5D%5B%5D=&search%5Bnear%5D%5B%5D=100&commit=Search" for 127.0.0.1 at 2011-04-28 12:00:39 -0500
Processing by PhotosController#index as HTML
Parameters: {"utf8"=>"✓", "search"=>{"context_id_in"=>["6"], "tagged_with"=>"", "text_contains"=>"", "near"=>["", "100"]}, "commit"=>"Search"}
SQL (0.4ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
SQL (0.3ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Context Load (0.4ms) SELECT "contexts".* FROM "contexts" ORDER BY "contexts"."display_order" ASC
Focus Load (0.3ms) SELECT "focus".* FROM "focus" ORDER BY "focus"."display_order" ASC
LandUse Load (0.4ms) SELECT "land_uses".* FROM "land_uses" ORDER BY "land_uses"."display_order" ASC
Rendered static/_help-context.html.haml (4.6ms)
Rendered static/_help-focus.html.haml (3.1ms)
Rendered photos/_search.html.haml (161.0ms)
SQL (0.4ms) SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6) LIMIT 1 OFFSET 0
Photo Load (0.7ms) SELECT "photos".* FROM "photos" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6) LIMIT 1 OFFSET 0
Attachment Load (0.2ms) SELECT "attachments".* FROM "attachments" WHERE ("attachments".photo_id = 1)
User Load (0.9ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1)
Profile Load (1.9ms) SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
Context Load (0.2ms) SELECT "contexts".* FROM "contexts" WHERE "contexts"."id" = 6 ORDER BY "contexts"."display_order" ASC LIMIT 1
Focus Load (0.2ms) SELECT "focus".* FROM "focus" WHERE "focus"."id" = 2 ORDER BY "focus"."display_order" ASC LIMIT 1
LandUse Load (0.2ms) SELECT * FROM "land_uses" INNER JOIN "land_uses_photos" ON "land_uses".id = "land_uses_photos".land_use_id WHERE ("land_uses_photos".photo_id = 1 ) ORDER BY "land_uses"."display_order" ASC
Rendered photos/_photo_tiles.html.haml (204.2ms)
SQL (0.3ms) SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6)
Rendered shared/_feedback.html.haml (1.3ms)
Role Load (0.4ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
CACHE (0.0ms) SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
CACHE (0.0ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
Rendered shared/_menu.html.haml (35.5ms)
Rendered shared/_footer.html.haml (2.9ms)
Rendered photos/index.html.haml within layouts/application (729.3ms)
Completed 200 OK in 990ms (Views: 728.5ms | ActiveRecord: 7.7ms)
Para la segunda página de una búsqueda (no muestra resultados a pesar de que existen):
Started GET "/photos?commit=Search&page=2&search[context_id_in][]=6&search[near][]=&search[near][]=100&search[tagged_with]=&search[text_contains]=&utf8=%E2%9C%93" for 127.0.0.1 at 2011-04-28 12:01:33 -0500
Processing by PhotosController#index as HTML
Parameters: {"commit"=>"Search", "page"=>"2", "search"=>{"context_id_in"=>["6"], "near"=>["", "100"], "tagged_with"=>"", "text_contains"=>""}, "utf8"=>"✓"}
SQL (0.4ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
SQL (0.3ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Context Load (0.3ms) SELECT "contexts".* FROM "contexts" ORDER BY "contexts"."display_order" ASC
Focus Load (0.3ms) SELECT "focus".* FROM "focus" ORDER BY "focus"."display_order" ASC
LandUse Load (0.3ms) SELECT "land_uses".* FROM "land_uses" ORDER BY "land_uses"."display_order" ASC
Rendered static/_help-context.html.haml (4.9ms)
Rendered static/_help-focus.html.haml (3.4ms)
Rendered photos/_search.html.haml (307.8ms)
SQL (0.3ms) SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6) LIMIT 1 OFFSET 1
SQL (0.3ms) SELECT COUNT(DISTINCT "photos"."id") FROM "photos" LEFT OUTER JOIN "attachments" ON "attachments"."photo_id" = "photos"."id" LEFT OUTER JOIN "collections" ON "collections"."id" = "photos"."collection_id" WHERE "photos"."collection_id" IS NULL AND "photos"."context_id" IN (6)
Rendered shared/_feedback.html.haml (1.5ms)
Role Load (0.4ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
Profile Load (1.6ms) SELECT "profiles".* FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
CACHE (0.0ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles".id = "roles_users".role_id WHERE "roles"."name" = 'admin' AND ("roles_users".user_id = 1 ) LIMIT 1
Rendered shared/_menu.html.haml (209.5ms)
Rendered shared/_footer.html.haml (2.7ms)
Rendered photos/index.html.haml within layouts/application (822.3ms)
Completed 200 OK in 934ms (Views: 823.7ms | ActiveRecord: 5.1ms)
Nuevamente tenga en cuenta que en los registros anteriores he establecido la paginación en 1 por página para que pueda ver si el paginador muestra el número correcto de resultados, y lo es. Por ejemplo, si busco algo, sé que hay 3 coincidencias en una por página, el paginador dice que hay tres páginas de resultados, sin embargo, las páginas 2 y 3 están en blanco.
Estoy completamente perplejo, cualquier ayuda sería muy apreciada.
Solución
Intente agregar su alcance como método de búsqueda.
class Photo < ActiveRecord::Base
scope :community, where(:collection_id => nil)
search_methods :community
end
class PhotosController < ActiveRecord::Base
def index
params[:search][:community] => true
@search = Photo.search(params[:search])
@photos = @search.page(params[:page]).per(20)
end
end
No uso Kaminari, así que no puedo decirlo con certeza, pero sé que los documentos de Metasearch dicen que usa Search_methods para usar ámbitos en las búsquedas.
Otros consejos
Funciona para mí con las últimas gemas actuales (Meta_Search 1.0.4, Kaminari 0.12.4).
Como autor de Kaminari Gem, supongo que algunas versiones más antiguas de Kaminari posiblemente no funcionan con Meta_Search. De hecho, solucioné varios errores que pueden causar este tipo de problema.
Entonces, ¿puedes actualizar tu gema Kaminari e intentarlo de nuevo?