window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() Enkla filter i Rails API - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2022-02-23
Utveckling av programvara

Enkla filter i Rails API

Codest

Krzysztof Buszewicz

Senior Software Engineer

Är du arg varje gång du ser muterande instansvariabler i Rails Controller för att filtrera data? Den här artikeln är för dig.

Filter

Du har säkert sett det här förut:

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

modul API
  modul V1
    klass ThingsController < BasController
      def index
        @things = Ting.alla
        @things = @things.where(size: params[:size]) if params[:size]
        @things = @things.where('name ILIKE ?', "%#{params[:name_contains]}%") if params[:name_contains]

        render json: @ting
      slut
    slut
  slut
slut

Varför anser jag att det är en dålig kod? För att det helt enkelt gör vår controller fet.
IMHO bör vi extrahera så mycket logik som möjligt från styrenheter och använda en ändamålsrelaterad
verktyg eller tjänster. I det här fallet kommer vi att implementera ett generiskt filter som vi kommer att kunna
att använda över många styrenheter.

Men vänta, låt oss först analysera den nuvarande koden. Den kan vara dålig men fungerar ändå.
Vi har en viss initial omfattning (Sak.alla) och sedan begränsar det om användaren har passerat
relaterad parameter. För varje filter kontrollerar vi faktiskt om parametern godkändes och i så fall,
vi applicerar ett filter. Den andra saken är att vi inte behöver använda ivar, vi kan använda
vanliga gamla lokala variabler.

Okej, då så. Kan vi inte använda något serviceobjekt för att mutera det initiala omfånget?
Utförandet kan se ut så här:

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

modul API
  modul V1
    klass ThingsController < BasController
      def index
        scope = Ting.alla
        saker = Things::IndexFilter.new.call(scope, params)

        rendera json: saker
      slut
    slut
  slut
slut

Det ser mycket bättre ut nu, men vi måste naturligtvis implementera filtret ännu.
Observera att anropets signatur kommer att vara densamma för alla resurser, så vi kan ha
någon generisk klass för denna uppgift.

# app/services/generic/index_filter.rb

modul Generisk
  klass IndexFilter
    EMPTY_HASH = {}.freeze

    def self.filter
      EMPTY_HASH
    slut

    def anrop(omfattning, params)
      apply_filters!(self.class.filters.keys, scope, params)
    slut

    privat

    def tillämpa_filter!(filter_nycklar, omfattning, params)
      filter_keys.inject(scope.dup) do |aktuellt_scope, filter_nyckel|
        apply_filter!(filter_key, aktuellt_område, params)
      slut
    slut

    def apply_filter!(filter_key, scope, params)
      filter = hämta_filter(filter_nyckel)
      return scope om inte apply_filter?(filter, params)

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

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

    def hämta_filter(filter_nyckel)
      self.class.filters.fetch(filter_key) { raise ArgumentError, 'okänt filter' }
    end
  slut
slut

Verkar det komplicerat? Inte riktigt - all magi sker i #apply_filter!.
Vi tar duplikatet av det ursprungliga omfånget och tillämpar varje filter på det.

När vi tillämpar omfattningen innebär det att vi muterar duplikatet av vår ursprungliga omfattning.
Och vi förväntar oss att filter ska implementeras som en hash i self.filter metod
av en barnklass. Låt oss göra det.

# app/services/things/index_filter.rb

modul Saker
  klass IndexFilter (params) {
          params[:size].is_a?(String)
        },
        apply: ->(scope, params) {
          scope.where(size: params[:size])
        }
      }.freeze,
      namn_innehåller_filter: {
        apply?: ->(params) {
          params[:name_contains].is_a?(String)
        },
        apply: ->(scope, params) {
          scope.where('namn LIKNAR ?',"%#{params[:namn_innehåller]}%")
        }
      }.frysa
    }.freeze

    def self.filter
      FILTRAR
    slut
  slut
slut

Nu är det klart! Vi har skrivit mer kod, men de enkla filtren kommer att se likadana ut
sätt för alla resurser. Vi har rensat kontrollern från den ansvariga koden
av filtrering och tillhandahållit en "specialiserad" klass för detta ändamål som följer mycket
tydlig konvention.

Erbjudande för Ruby-utvecklare

Läs mer om detta:

För- och nackdelar med mjukvaruutveckling med Ruby

Räls och andra transportmedel

Rails-utveckling med TMUX, Vim, Fzf + Ripgrep

Relaterade artiklar

Utveckling av programvara

Bygg framtidssäkrade webbappar: Insikter från The Codest:s expertteam

Upptäck hur The Codest utmärker sig genom att skapa skalbara, interaktiva webbapplikationer med banbrytande teknik som ger sömlösa användarupplevelser på alla plattformar. Läs om hur vår expertis driver digital omvandling och affärsutveckling...

DEKODEST
Utveckling av programvara

Topp 10 Lettlandsbaserade mjukvaruutvecklingsföretag

Läs mer om Lettlands främsta mjukvaruutvecklingsföretag och deras innovativa lösningar i vår senaste artikel. Upptäck hur dessa teknikledare kan hjälpa till att lyfta ditt företag.

thecodest
Lösningar för företag och uppskalningsföretag

Java Software Development Essentials: En guide till framgångsrik outsourcing

Utforska denna viktiga guide om framgångsrik outsourcing av Java-programvaruutveckling för att förbättra effektiviteten, få tillgång till expertis och driva projektframgång med The Codest.

thecodest
Utveckling av programvara

Den ultimata guiden till outsourcing i Polen

Den kraftiga ökningen av outsourcing i Polen drivs av ekonomiska, utbildningsmässiga och tekniska framsteg, vilket främjar IT-tillväxt och ett företagsvänligt klimat.

TheCodest
Lösningar för företag och uppskalningsföretag

Den kompletta guiden till verktyg och tekniker för IT-revision

IT-revisioner säkerställer säkra, effektiva och kompatibla system. Läs mer om hur viktiga de är genom att läsa hela artikeln.

Codest
Jakub Jakubowicz CTO och medgrundare

Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

    Om oss

    The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

    Förenade kungariket - Huvudkontor

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokala tekniknav

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polen

      Codest

    • Hem
    • Om oss
    • Tjänster
    • Fallstudier
    • Vet hur
    • Karriär
    • Ordbok

      Tjänster

    • Det rådgivande
    • Utveckling av programvara
    • Backend-utveckling
    • Frontend-utveckling
    • Staff Augmentation
    • Backend-utvecklare
    • Ingenjörer inom molntjänster
    • Dataingenjörer
    • Övriga
    • QA-ingenjörer

      Resurser

    • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
    • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
    • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
    • Vilka är de största utmaningarna för CTO:er och CIO:er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Användarvillkor för webbplatsen

    Copyright © 2025 av The Codest. Alla rättigheter reserverade.

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