Pregunta

Estoy creando una búsqueda con las palabras clave en caché en una tabla. Antes de que una palabra clave ingresada por el usuario se busque en la tabla, se normaliza. Por ejemplo, se elimina alguna puntuación como '-' y la carcasa está estandarizada. La palabra clave normalizada se utiliza para buscar los resultados de búsqueda.

Actualmente estoy manejando la normalización en el controlador con un before_filter. Me preguntaba si había una manera de hacer esto en el modelo. Algo conceptualmente como un " before_find " la devolución de llamada funcionaría aunque eso no tendría sentido en un nivel de instancia.

¿Fue útil?

Solución

Deberías estar utilizando ámbitos con nombre:

class Whatever < ActiveRecord::Base

  named_scope :search, lambda {|*keywords|
    {:conditions => {:keyword => normalize_keywords(keywords)}}}

  def self.normalize_keywords(keywords)
    # Work your magic here
  end

end

El uso de ámbitos con nombre te permitirá encadenar con otros ámbitos, y es realmente la manera de usar Rails 3.

Otros consejos

Probablemente no quieras implementar esto anulando la búsqueda. Anular algo como encontrar probablemente será un dolor de cabeza en la línea.

Podrías crear un método de clase que haga lo que necesites, sin embargo, algo como:

class MyTable < ActiveRecord::Base
  def self.find_using_dirty_keywords(*args)
    #Cleanup input
    #Call to actual find
  end
end

Si realmente desea sobrecargar la búsqueda, puede hacerlo de esta manera:

Como ejemplo:

class MyTable < ActiveRecord::Base
  def self.find(*args)
    #work your magic here
    super(args,you,want,to,pass)
  end
end

Para obtener más información sobre las subclasificaciones, consulte este enlace: Ruby Tips

al igual que lo anterior, también puedes usar un alias_method_chain .

class YourModel < ActiveRecord::Base

  class << self
    def find_with_condition_cleansing(*args)
      #modify your args
      find_without_condition_cleansing(*args)
    end
    alias_method_chain :find, :condition_cleansing
  end

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