window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versión: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster ya existe') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Filtros sencillos en la API de Rails - The Codest
The Codest
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Industrias
    • Fintech y Banca
    • E-commerce
    • Adtech
    • Tecnología sanitaria
    • Fabricación
    • Logística
    • Automoción
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
Flecha atrás VOLVER
2022-02-23
Desarrollo de software

Filtros sencillos en la API de Rails

The Codest

Krzysztof Buszewicz

Senior Software Engineer

Te enfadas cada vez que ves mutar variables de instancia en el controlador rails para filtrar datos? Este artículo es para ti 🙂 .

Filtros

Probablemente ya lo haya visto antes:

# app/controllers/api/v1/things_controller.rb

módulo API
  módulo V1
    clase ThingsController < BaseController
      def index
        @cosas = Cosa.todo
        @cosas = @cosas.where(tamaño: parámetros[:tamaño]) if parámetros[:tamaño]
        @things = @things.where('nombre ILIKE ?', "%#{params[:nombre_contiene]}%") if params[:nombre_contiene]

        render json: @cosas
      end
    end
  end
fin

¿Por qué lo considero un mal código? Porque simplemente engorda a nuestro controlador.
En mi humilde opinión, deberíamos extraer toda la lógica que podamos de los controladores y utilizar un propósito relacionado con
utilidades o servicios. En este caso implementaremos un filtro genérico que podremos
para utilizar en muchos controladores.

Pero espera, primero analicemos el código actual. Puede ser malo pero funciona.
Tenemos un alcance inicial (Cosa.todo) y luego se limitan si el usuario ha pasado
relacionado. Para cada filtro comprobamos si se ha pasado el parámetro y si es así,
aplicamos un filtro. Lo segundo es que no necesitamos usar el ivar, podemos usar
simples variables locales.

De acuerdo. ¿No podríamos usar algún objeto de servicio para mutar el ámbito inicial?
La ejecución puede ser así:

# app/controllers/api/v1/things_controller.rb

módulo API
  módulo V1
    clase ThingsController < BaseController
      def índice
        ámbito = Thing.all
        things = Things::IndexFilter.new.call(ámbito, parámetros)

        render json: cosas
      end
    end
  end
fin

Ahora se ve mucho mejor, pero por supuesto tenemos que implementar el filtro todavía.
Tenga en cuenta que la firma de la llamada será la misma para todos los recursos, por lo que podemos tener
alguna clase genérica para esta tarea.

# app/services/generic/index_filter.rb

módulo Generic
  clase IndexFilter
    EMPTY_HASH = {}.freeze

    def self.filters
      EMPTY_HASH
    end

    def call(ámbito, parámetros)
      apply_filters!(self.class.filters.keys, scope, params)
    end

    privado

    def ¡aplicar_filtros!(claves_filtro, ámbito, parámetros)
      filter_keys.inject(ámbito.dup) do |ámbito_actual, filter_key|
        apply_filter!(clave_filtro, ámbito_actual, parámetros)
      end
    fin

    def aplicar_filtro!(clave_filtro, ámbito, parámetros)
      filter = fetch_filter(clave_filtro)
      return ámbito unless aplicar_filtro?(filtro, parámetros)

      filter[:apply].call(ámbito, parámetros)
    fin

    def ¿aplicar_filtro?(filtro, parámetros)
      filter[:apply?].call(params)
    end

    def buscar_filtro(clave_filtro)
      self.class.filters.fetch(filter_key) { raise ArgumentError, 'filtro desconocido' }
    end
  end
fin

¿Parece complicado? En realidad no: toda la magia ocurre en ¡#apply_filters!.
Tomamos el duplicado del ámbito inicial y le aplicamos cada filtro.

Cuando aplicamos el ámbito significa que mutamos el duplicado de nuestro ámbito inicial.
Y esperamos que los filtros se implementen como un hash en el archivo auto.filtros método
de una clase infantil. Hagámoslo.

# app/services/things/index_filter.rb

módulo Things
  clase IndexFilter (parámetros) {
          params[:tamaño].is_a?(String)
        },
        apply: ->(ámbito, parámetros) {
          ámbito.where(tamaño: parámetros[:tamaño])
        }
      }.freeze,
      nombre_contiene_filtro: {
        ¿aplicar?: ->(parámetros) {
          params[:nombre_contiene].is_a?(String)
        },
        apply: ->(ámbito, parámetros) {
          scope.where('nombre ILIKE ?', "%#{params[:nombre_contiene]}%")
        }
      }.freeze
    }.congelar

    def self.filters
      FILTROS
    end
  end
end

Ya está. Hemos escrito más código, pero los filtros simples tendrán el mismo aspecto
para todos los recursos. Hemos limpiado controlador del código responsable
de filtrado y proporcionó una clase "especializada" para este fin que sigue muy
convención clara.

Oferta de desarrollador Ruby

Más información:

Ventajas e inconvenientes del desarrollo de software con Ruby

Ferrocarriles y otros medios de transporte

Desarrollo Rails con TMUX, Vim, Fzf + Ripgrep

Artículos relacionados

Desarrollo de software

Crear aplicaciones web preparadas para el futuro: ideas del equipo de expertos de The Codest

Descubra cómo The Codest destaca en la creación de aplicaciones web escalables e interactivas con tecnologías de vanguardia, ofreciendo experiencias de usuario fluidas en todas las plataformas. Descubra cómo nuestra experiencia impulsa la transformación...

EL MEJOR
Desarrollo de software

Las 10 mejores empresas de desarrollo de software de Letonia

Conozca las principales empresas de desarrollo de software de Letonia y sus innovadoras soluciones en nuestro último artículo. Descubra cómo estos líderes tecnológicos pueden ayudarle a mejorar su negocio.

thecodest
Soluciones para empresas y escalas

Fundamentos del desarrollo de software Java: Guía para externalizar con éxito

Explore esta guía esencial sobre el desarrollo de software Java outsourcing con éxito para mejorar la eficiencia, acceder a la experiencia e impulsar el éxito de los proyectos con The Codest.

thecodest
Desarrollo de software

La guía definitiva para subcontratar en Polonia

El auge de las outsourcing en Polonia está impulsado por los avances económicos, educativos y tecnológicos, que fomentan el crecimiento de las TI y un clima favorable a las empresas.

TheCodest
Soluciones para empresas y escalas

Guía completa de herramientas y técnicas de auditoría informática

Las auditorías informáticas garantizan sistemas seguros, eficientes y conformes. Obtenga más información sobre su importancia leyendo el artículo completo.

The Codest
Jakub Jakubowicz CTO y Cofundador

Suscríbase a nuestra base de conocimientos y manténgase al día de la experiencia del sector informático.

    Quiénes somos

    The Codest - Empresa internacional de desarrollo de software con centros tecnológicos en Polonia.

    Reino Unido - Sede central

    • Oficina 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polonia - Centros tecnológicos locales

    • Parque de oficinas Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Embajada del Cerebro, Konstruktorska
      11, 02-673 Varsovia, Polonia

      The Codest

    • Inicio
    • Quiénes somos
    • Servicios
    • Case Studies
    • Saber cómo
    • Carreras profesionales
    • Diccionario

      Servicios

    • Asesoramiento
    • Desarrollo de software
    • Desarrollo backend
    • Desarrollo Frontend
    • Staff Augmentation
    • Desarrolladores de backend
    • Ingenieros de la nube
    • Ingenieros de datos
    • Otros
    • Ingenieros de control de calidad

      Recursos

    • Hechos y mitos sobre la cooperación con un socio externo de desarrollo de software
    • De EE.UU. a Europa: ¿Por qué las startups estadounidenses deciden trasladarse a Europa?
    • Comparación de los polos de desarrollo de Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filipinas), Eurasia (Turquía)
    • ¿Cuáles son los principales retos de los CTO y los CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condiciones de uso del sitio web

    Copyright © 2025 por The Codest. Todos los derechos reservados.

    es_ESSpanish
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean nl_NLDutch etEstonian elGreek es_ESSpanish