Implementando un ActiveRecord antes_find
-
03-07-2019 - |
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.
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