2011-03-16 7 views

Respuesta

11

Puede usar .matches para él.

> t[:name].matches('%lore').to_sql 
=> "\"products\".\"name\" LIKE '%lore'" 

El uso real en una consulta sería:

Speaker.where(Speaker.arel_table[:name].matches('%lore')) 
+0

No está mal. Supongo que el signo de porcentaje podría ser común entre SQLite, Postgres y Mysql. –

+1

Sugiera revisar el fragmento de código para leer: 'Speaker.where (Speaker.arel_table [: name] .matches ('% yson%'))' –

2

Utilice un motor de búsqueda como solr o sphinx para crear índices para las columnas en las que estaría realizando como consultas activadas. Al igual que las consultas siempre dan como resultado una exploración completa de la tabla cuando mira el plan de explicación, por lo que casi nunca debería usarlas en un sitio de producción.

+1

He votado esto, pero "realmente nunca debería usarlos" es un poco fuerte. Si tiene un número medio de registros, preferiría utilizar una consulta similar a la de recuperar e iterar en el nivel intermedio. Obviamente, si el rendimiento llega a ser un problema, ENTONCES debería usar un índice. Creo que querías decir "o" no "de" por cierto. –

1
No

por defecto en los carriles, ya que hay muchas opciones de base de datos (MySQL, PostgreSQL, MongoDB, CouchDB ...), pero se puede comprobar fuera de joyas como MetaWhere, donde se pueden hacer cosas como:

Article.where(:title.matches => 'Hello%', :created_at.gt => 3.days.ago) 
    => SELECT "articles".* FROM "articles" WHERE ("articles"."title" LIKE 'Hello%') 
    AND ("articles"."created_at" > '2010-04-12 18:39:32.592087') 

en general, sin embargo es probable que tenga que tener algún código específico DB o refactorizar su código (es decir, redefinir el operador .matches en s símbolos en MetaWhere) para trabajar con una base de datos diferente. Es de esperar que no cambie su base de datos con frecuencia, pero si lo hace, debe tener una ubicación centralizada donde defina estos operadores para su reutilización. Tenga en cuenta que un operador o función definida en una base de datos puede no estar disponible en otra, en cuyo caso tener esta operación generalizada es discutible ya que no podrá realizar la búsqueda de todos modos.

+0

Gracias. Nunca se trata de cambiar el DB: se trata de que el nivel intermedio NO se llene con código específico de DB, por lo que puede cortarlo y pegarlo, y generalmente se olvida que el DB existe. –

+0

Entonces creo que la gema MetaWhere es su mejor apuesta. Resume esto y le permite usar una sintaxis genial como: title.matches en lugar de 'title LIKE?'. –

+0

gracias espero echarle un vistazo pronto –

23

En Rails 3 o mayor

Speaker.where("name LIKE ?", "%yson%") 

En Rails 2

Speaker.all(:conditions => ["name LIKE ?", "%yson%"]) 

Evitar interpolar directamente cuerdas debido a que el valor no se escapó y que son vulnerables a los ataques de inyección SQL.

+1

genial y correcto, aunque no responde la pregunta. –

Cuestiones relacionadas