Implementando um ActiveRecord antes_find
-
03-07-2019 - |
Pergunta
Estou construindo uma pesquisa com as palavras -chave cache em uma tabela. Antes que uma palavra-chave insuportada pelo usuário seja procurada na tabela, ela é normalizada. Por exemplo, alguma pontuação como '-' é removida e o revestimento é padronizado. A palavra -chave normalizada é usada para encontrar os resultados da pesquisa.
Atualmente, estou lidando com a normalização no controlador com um antes_filter. Eu queria saber se havia uma maneira de fazer isso no modelo. Algo conceitualmente como um retorno de chamada "antes_find" funcionaria, embora isso não faria sentido para um nível de instância.
Solução
Você deve estar usando escopos nomeados:
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
O uso de escopos nomeados permitirá que você se encorrente com outros escopos e é realmente o caminho a seguir o Rails 3.
Outras dicas
Você provavelmente não deseja implementar isso substituindo o encontro. Substituir algo como o encontro provavelmente será uma dor de cabeça na linha.
Você pode criar um método de classe que faça o que você precisa, no entanto, algo como:
class MyTable < ActiveRecord::Base
def self.find_using_dirty_keywords(*args)
#Cleanup input
#Call to actual find
end
end
Se você verdade Deseja sobrecarregar, encontre que você pode fazer da seguinte:
Como um exemplo:
class MyTable < ActiveRecord::Base
def self.find(*args)
#work your magic here
super(args,you,want,to,pass)
end
end
Para obter mais informações sobre a subclasse checkout deste link: Dicas de rubi
Muito parecido com o exposto, você também pode usar um 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