window.pipedriveLeadboosterConfig = { base : 'leadbooster-chat.pipedrive.com', companyId : 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version : 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster existe déjà') } 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 }) }, } } })() Filtres simples dans l'API Rails - The Codest
The Codest
  • A propos de nous
  • Services
    • Développement de logiciels
      • Développement frontal
      • Développement backend
    • Staff Augmentation
      • Développeurs frontaux
      • Développeurs backend
      • Ingénieurs des données
      • Ingénieurs en informatique dématérialisée
      • Ingénieurs AQ
      • Autres
    • Conseil consultatif
      • Audit et conseil
  • Industries
    • Fintech et banque
    • E-commerce
    • Adtech
    • Santé (Healthtech)
    • Fabrication
    • Logistique
    • Automobile
    • IOT
  • Valeur pour
    • CEO
    • CTO
    • Gestionnaire des livraisons
  • Notre équipe
  • Études de cas
  • Savoir comment
    • Blog
    • Rencontres
    • Webinaires
    • Ressources
Carrières Prendre contact
  • A propos de nous
  • Services
    • Développement de logiciels
      • Développement frontal
      • Développement backend
    • Staff Augmentation
      • Développeurs frontaux
      • Développeurs backend
      • Ingénieurs des données
      • Ingénieurs en informatique dématérialisée
      • Ingénieurs AQ
      • Autres
    • Conseil consultatif
      • Audit et conseil
  • Valeur pour
    • CEO
    • CTO
    • Gestionnaire des livraisons
  • Notre équipe
  • Études de cas
  • Savoir comment
    • Blog
    • Rencontres
    • Webinaires
    • Ressources
Carrières Prendre contact
Flèche arrière RETOUR
2022-02-23
Développement de logiciels

Filtres simples dans l'API Rails

The Codest

Krzysztof Buszewicz

Senior Software Engineer

Vous êtes en colère à chaque fois que vous voyez des variables d'instance mutantes dans un contrôleur rails pour filtrer des données ? Cet article est fait pour vous 🙂 .

Filtres

Vous avez probablement déjà vu cela :

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

module API
  module V1
    classe ThingsController < BaseController
      def index
        @things = Thing.all
        @things = @things.where(size : params[:size]) if params[:size]
        @things = @things.where('name ILIKE ?', "%#{params[:name_contains]}%") if params[:name_contains]

        render json : @choses
      end
    fin
  fin
fin

Pourquoi est-ce que je considère qu'il s'agit d'une mauvaise code? Parce qu'il fait tout simplement grossir notre contrôleur.
Selon moi, nous devrions extraire autant de logique que possible des contrôleurs et utiliser un système de contrôle de l'utilisation.
ou des services. Dans ce cas, nous mettrons en place un filtre générique qui nous permettra de
à utiliser sur plusieurs contrôleurs.

Mais attendez, analysons d'abord le code actuel. Il peut être mauvais mais fonctionne.
Nous disposons d'un champ d'application initial (Chose.tout) et la limitent si l'utilisateur a passé le cap de la
paramètre lié à un filtre. Pour chaque filtre, nous vérifions si le paramètre a été transmis et si c'est le cas,
nous appliquons un filtre. La deuxième chose est que nous n'avons pas besoin d'utiliser l'ivar, nous pouvons utiliser
de simples variables locales.

D'accord, alors. Ne pourrions-nous pas utiliser un objet de service pour modifier la portée initiale ?
L'exécution peut se présenter comme suit :

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

module API
  module V1
    classe ThingsController < BaseController
      def index
        scope = Thing.all
        things = Things::IndexFilter.new.call(scope, params)

        render json : things
      end
    end
  end
fin

Le résultat est bien meilleur, mais nous devons encore mettre en place le filtre.
Notez que la signature de l'appel sera la même pour toutes les ressources, nous pouvons donc avoir
une classe générique pour cette tâche.

# app/services/generic/index_filter.rb

module Generic
  classe IndexFilter
    EMPTY_HASH = {}.freeze

    def self.filters
      EMPTY_HASH
    end

    def call(scope, params)
      apply_filters !(self.class.filters.keys, scope, params)
    end

    private

    def apply_filters !(filter_keys, scope, params)
      filter_keys.inject(scope.dup) do |current_scope, filter_key|
        apply_filter !(filter_key, current_scope, params)
      end
    fin

    def apply_filter !(filter_key, scope, params)
      filter = fetch_filter(filter_key)
      return scope unless apply_filter ?(filter, params)

      filter[:apply].call(scope, params)
    fin

    def apply_filter ?(filter, params)
      filter[:apply ?].call(params)
    end

    def fetch_filter(filter_key)
      self.class.filters.fetch(filter_key) { raise ArgumentError, 'unknown filter' }
    end
  end
end

Cela semble compliqué ? Pas vraiment - toute la magie se passe dans #apply_filters !.
Nous prenons le duplicata de l'étendue initiale et lui appliquons chaque filtre.

Lorsque nous appliquons le champ d'application, cela signifie que nous mutons le duplicata de notre champ d'application initial.
Nous nous attendons à ce que les filtres soient mis en œuvre sous la forme d'un hachage dans le fichier self.filters méthode
d'une classe enfantine. C'est ce que nous allons faire.

# app/services/things/index_filter.rb

module Things
  class IndexFilter (params) {
          params[:size].is_a ?(String)
        },
        apply : ->(scope, params) {
          scope.where(size : params[:size])
        }
      }.freeze,
      name_contains_filter : {
        apply? : ->(params) {
          params[:name_contains].is_a ?(String)
        },
        apply : ->(scope, params) {
          scope.where('name ILIKE ?', "%#{params[:name_contains]}%")
        }
      }.freeze
    }.freeze

    def self.filters
      FILTERS
    fin
  end
end

Voilà, c'est fait ! Nous avons écrit plus de code, mais les filtres simples se présentent de la même manière
pour toutes les ressources. Nous avons nettoyé le contrôleur du code responsable
de filtrage et a prévu une classe "spécialisée" à cet effet, qui suit de très près le processus de filtrage.
une convention claire.

Offre développeur Ruby

En savoir plus :

Avantages et inconvénients du développement de logiciels en Rubis

Rails et autres moyens de transport

Développement Rails avec TMUX, Vim, Fzf + Ripgrep

Articles connexes

Développement de logiciels

Construire des applications web à l'épreuve du temps : les conseils de l'équipe d'experts de The Codest

Découvrez comment The Codest excelle dans la création d'applications web évolutives et interactives à l'aide de technologies de pointe, offrant une expérience utilisateur transparente sur toutes les plateformes. Découvrez comment notre expertise favorise la transformation numérique et la...

LE CODEST
Développement de logiciels

Les 10 premières entreprises de développement de logiciels basées en Lettonie

Découvrez les principales sociétés de développement de logiciels en Lettonie et leurs solutions innovantes dans notre dernier article. Découvrez comment ces leaders de la technologie peuvent vous aider à développer votre entreprise.

thecodest
Solutions pour les entreprises et les grandes entreprises

L'essentiel du développement de logiciels Java : Un guide pour une externalisation réussie

Explorez ce guide essentiel sur le développement réussi de logiciels Java outsourcing pour améliorer l'efficacité, accéder à l'expertise et assurer la réussite des projets avec The Codest.

thecodest
Développement de logiciels

Le guide ultime de l'externalisation en Pologne

L'essor de outsourcing en Pologne est dû aux progrès économiques, éducatifs et technologiques, qui favorisent la croissance des technologies de l'information et un climat propice aux entreprises.

TheCodest
Solutions pour les entreprises et les grandes entreprises

Le guide complet des outils et techniques d'audit informatique

Les audits informatiques garantissent la sécurité, l'efficacité et la conformité des systèmes. Pour en savoir plus sur leur importance, lisez l'article complet.

The Codest
Jakub Jakubowicz CTO & Co-Fondateur

Abonnez-vous à notre base de connaissances et restez au courant de l'expertise du secteur des technologies de l'information.

    A propos de nous

    The Codest - Entreprise internationale de développement de logiciels avec des centres technologiques en Pologne.

    Royaume-Uni - Siège

    • Bureau 303B, 182-184 High Street North E6 2JA
      Londres, Angleterre

    Pologne - Les pôles technologiques locaux

    • Parc de bureaux Fabryczna, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Varsovie, Pologne

      The Codest

    • Accueil
    • A propos de nous
    • Services
    • Études de cas
    • Savoir comment
    • Carrières
    • Dictionnaire

      Services

    • Conseil consultatif
    • Développement de logiciels
    • Développement backend
    • Développement frontal
    • Staff Augmentation
    • Développeurs backend
    • Ingénieurs en informatique dématérialisée
    • Ingénieurs des données
    • Autres
    • Ingénieurs AQ

      Ressources

    • Faits et mythes concernant la coopération avec un partenaire externe de développement de logiciels
    • Des États-Unis à l'Europe : Pourquoi les startups américaines décident-elles de se délocaliser en Europe ?
    • Comparaison des pôles de développement Tech Offshore : Tech Offshore Europe (Pologne), ASEAN (Philippines), Eurasie (Turquie)
    • Quels sont les principaux défis des CTO et des DSI ?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Conditions d'utilisation du site web

    Copyright © 2025 par The Codest. Tous droits réservés.

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