Ante el mal resultado que nos da Sphinx, que no permite buscar trozos de
palabras ni incluir la @ en las búsquedas, estoy tratando de hacer
búsquedas directamente sobre la BBDD. Pero tengo un problema con
ActiveRecord, y es que se comporta diferente en función de la palabra
que busco… Éste es el código:
orden = 2
condicion = "email like '%#{q}%' OR nick like '%#{q}%' OR nombre
like ‘%#{q}%’ OR apellidos like ‘%#{q}%’"
nusr = Usuario.count( :conditions => condicion )
@usuarios = Usuario.paginate( :per_page => 25, :page => @pagina,
:order => orden, :total_entries => nusr,
:select => “usuarios.puntos,
usuarios.posicion_ranking, usuarios.nick, usuarios.num_fans,
usuarios.nick_limpio, usuarios.id”,
:include => :estadisticas, :conditions => condicion )
Si busco @rankia, me va bien:
Processing UsuarioController#ranking (for 127.0.0.1 at 2008-09-18
14:48:40) [GET]
Parameters: {“commit”=>“Buscar”, “action”=>“ranking”, “q”=>“@rankia”,
“controller”=>“usuario”}
[4;36;1mSQL (0.136514) [0m [0;1mSELECT count(*) AS count_all FROM
usuarios
WHERE ((email like ‘%@rankia%’ OR nick like ‘%@rankia%’ OR
nombre like ‘%@rankia%’ OR apellidos like ‘%@rankia%’)) [0m
[4;35;1mUsuario Load (0.250714) [0m [0mSELECT usuarios.puntos,
usuarios.posicion_ranking, usuarios.nick, usuarios.num_fans,
usuarios.nick_limpio, usuarios.id FROM usuarios
WHERE ((email like
‘%@rankia%’ OR nick like ‘%@rankia%’ OR nombre like ‘%@rankia%’ OR
apellidos like ‘%@rankia%’)) ORDER BY 2 LIMIT 0, 25 [0m
[4;36;1mEstadistica Load (0.021374) [0m [0;1mSELECT
estadisticas
.* FROM estadisticas
WHERE (estadisticas
.usuario_id IN
(203,18170,18198,18369)) [0m
[4;35;1mEstadistica Columns (0.022831) [0m [0mSHOW FIELDS FROM
estadisticas
[0m
Completed in 0.89611 (1 reqs/sec) | Rendering: 0.02171 (2%) | DB:
0.79735 (88%) | 200 OK
[http://localhost/usuarios/ranking/total?q=%40rankia&commit=Buscar]
Pero si busco @rankia.com , me cambia la estructura de SQLs que genera,
provocando un error:
Processing UsuarioController#ranking (for 127.0.0.1 at 2008-09-18
14:48:46) [GET]
Parameters: {“commit”=>“Buscar”, “action”=>“ranking”,
“q”=>“@rankia.com”, “controller”=>“usuario”}
[4;36;1mSQL (0.180195) [0m [0;1mSELECT count(*) AS count_all FROM
usuarios
WHERE ((email like ‘[email protected]%’ OR nick like
‘[email protected]%’ OR nombre like ‘[email protected]%’ OR apellidos like
‘[email protected]%’)) [0m
[4;35;1mEstadistica Columns (0.018872) [0m [0mSHOW FIELDS FROM
estadisticas
[0m
[4;36;1mUsuario Load IDs For Limited Eager Loading (0.000000) [0m
[0;1mMysql::Error: #42S22Unknown column ‘2’ in ‘order clause’: SELECT
DISTINCT usuarios
.id FROM usuarios
WHERE ((email like
‘[email protected]%’ OR nick like ‘[email protected]%’ OR nombre like
‘[email protected]%’ OR apellidos like ‘[email protected]%’)) ORDER BY 2 LIMIT 0,
25 [0m
ActiveRecord::StatementInvalid (Mysql::Error: #42S22Unknown column ‘2’
in ‘order clause’: SELECT DISTINCT usuarios
.id FROM usuarios
WHERE ((email like ‘[email protected]%’ OR nick like ‘[email protected]%’ OR
nombre like ‘[email protected]%’ OR apellidos like ‘[email protected]%’)) ORDER
BY 2 LIMIT 0, 25)
Como veis, si meto un punto en la búsqueda me hace un Limited Eager
Loading, PERO CON EL ORDER BY!! y esto da error… Por qué pasa esto?
Como puedo solucionarlo???
s2