Eu normalmente estava usando has_scope gem para expor escopos de modelo para controladores de aplicativos. Embora seja muito conveniente para construir filtros de pesquisa simples, acabei tendo todos os escopos copiados de modelos específicos para os controladores correspondentes.
Para melhorar isso, primeiro comecei a extrair chamadas has_scope de controladores para os módulos separados implementados nas classes de modelo. Ter os escopos do controlador e do modelo em um local melhorou um pouco o gerenciamento.
https://gist.github.com/managr/6858852
Mesmo assim, não fiquei muito satisfeito com a duplicação de código e outros aspectos, como análise de critérios de pesquisa ou definição de seus valores padrão acontecendo diretamente no modelo.
Decidiu introduzir objetos de formulário para encapsular todos os critérios de pesquisa. Virtus foi muito útil para isso. Facilmente permitido definir os valores padrão e parâmetros simplificados do controlador de análise usando coerções personalizadas. Agora estou tendo um liner para analisar os parâmetros e escopo único para o objeto do formulário de pesquisa.
https://gist.github.com/managr/6859123
Controladores finos, objetos de pesquisa orientados ao domínio (local único para definir valores padrão e analisar critérios de pesquisa), sem duplicação de código. Experimente virtus !