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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top