Pregunta

¿Puedes traducir este código de rieles para mysql:

def Customer.find_by_key(key)
  Customer.find(:all, :conditions => "pre_name REGEXP '.*#{key}.*' 
      OR sur_name REGEXP '.*#{key}.*' 
      OR street REGEXP '.*#{key}.*' 
      OR zip REGEXP '.*#{key}.*' 
      OR city REGEXP '.*#{key}.*' 
      OR phone_1 REGEXP '.*#{key}.*' 
      OR phone_2 REGEXP '.*#{key}.*' 
      OR email REGEXP '.*#{key}.*' 
      OR company REGEXP '.*#{key}.*'")
end

al código SQLITE3?

¿Fue útil?

Solución

los REGEXP La función no se define de forma predeterminada en SQLITE3, tendrá que hacer un poco de trabajo antes.

Pegue esto en un inicializador (por ejemplo config/initializers/sqlite_regexp.rb), funciona con Rails 3.1 (ver más abajo para los rieles 3.0):

require 'active_record/connection_adapters/sqlite3_adapter'

class ActiveRecord::ConnectionAdapters::SQLite3Adapter
  def initialize(db, logger, config)
    super
    db.create_function('regexp', 2) do |func, pattern, expression|
      regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)

      if expression.to_s.match(regexp)
        func.result = 1
      else
        func.result = 0
      end
    end
  end
end

Robado el código aquí.

Por supuesto, podría reescribir su consulta como en la respuesta de @MU, pero pensé que sería bueno saber cómo implementar realmente la función.

Actualizar

El código anterior no funciona para Rails 3.0, esto debería funcionar:

require 'active_record/base'
require 'active_record/connection_adapters/sqlite_adapter'

module ActiveRecord::ConnectionAdapters
  class SQLite3Adapter < SQLiteAdapter
    def initialize(db, logger, config)
      super
      db.create_function('regexp', 2) do |func, pattern, expression|
        regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)

        if expression.to_s.match(regexp)
          func.result = 1
        else
          func.result = 0
        end
      end
    end
  end
end

Otros consejos

Reemplace estos:

pre_name REGEXP '.*#{key}.*'

con como:

pre_name LIKE '%#{key}%'

O mejor, use marcadores de posición:

:conditions => [
    "pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
    { :pattern => '%' + key + '%' }
]

Sqlite Comprende regexp pero no se implementa de forma predeterminada, tienes que implementarlo tú mismo. Puede agregar su implementación, pero no tiene sentido cuando probablemente haga el trabajo.

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