window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = Fenster if (w.LeadBooster) { console.warn('LeadBooster existiert bereits') } 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 }) }, } } })() Einfache Filter in der Rails-API - The Codest
Der Codest
  • Über uns
  • Dienstleistungen
    • Software-Entwicklung
      • Frontend-Softwareentwicklung
      • Backend-Softwareentwicklung
    • Staff Augmentation
      • Frontend-Entwickler
      • Backend-Entwickler
      • Daten-Ingenieure
      • Cloud-Ingenieure
      • QS-Ingenieure
      • Andere
    • IT-Beratung
      • Prüfung und Beratung
  • Branchen
    • Fintech & Bankwesen
    • E-commerce
    • Adtech
    • Gesundheitstechnik
    • Herstellung
    • Logistik
    • Automobilindustrie
    • IOT
  • Wert für
    • CEO
    • CTO
    • Delivery Manager
  • Unser Team
  • Fallstudien
  • Gewusst wie
    • Blog
    • Begegnungen
    • Webinare
    • Ressourcen
Karriere Kontakt aufnehmen
  • Über uns
  • Dienstleistungen
    • Software-Entwicklung
      • Frontend-Softwareentwicklung
      • Backend-Softwareentwicklung
    • Staff Augmentation
      • Frontend-Entwickler
      • Backend-Entwickler
      • Daten-Ingenieure
      • Cloud-Ingenieure
      • QS-Ingenieure
      • Andere
    • IT-Beratung
      • Prüfung und Beratung
  • Wert für
    • CEO
    • CTO
    • Delivery Manager
  • Unser Team
  • Fallstudien
  • Gewusst wie
    • Blog
    • Begegnungen
    • Webinare
    • Ressourcen
Karriere Kontakt aufnehmen
Pfeil zurück ZURÜCK
2022-02-23
Software-Entwicklung

Einfache Filter in der Rails-API

Der Codest

Krzysztof Buszewicz

Senior Software Engineer

Ärgern Sie sich auch jedes Mal, wenn Sie sehen, dass Instanzvariablen im Rails-Controller mutieren, um Daten zu filtern? Dieser Artikel ist für Sie 🙂 .

Filter

Sie haben das wahrscheinlich schon einmal gesehen:

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

Modul API
  Modul V1
    Klasse ThingsController < BaseController
      def index
        @things = Thing.all
        @things = @things.where(Größe: params[:Größe]) if params[:Größe]
        @things = @things.where('name ILIKE ?', "%#{params[:name_contains]}%") if params[:name_contains]

        render json: @dinge
      end
    end
  end
end

Warum halte ich es für eine schlechte Code? Weil es unseren Controller einfach fett macht.
IMHO sollten wir so viel Logik wie möglich aus Controllern extrahieren und eine zweckbezogene
Dienstprogramme oder Dienste. In diesem Fall werden wir einen generischen Filter implementieren, der es uns ermöglicht
für viele Controller zu verwenden.

Aber warten Sie, lassen Sie uns zuerst den aktuellen Code analysieren. Er kann schlecht sein, funktioniert aber trotzdem.
Wir haben einen anfänglichen Spielraum (Sache.alle) und schränken es dann ein, wenn der Benutzer die
bezogenen Parameter. Für jeden Filter wird geprüft, ob der Parameter übergeben wurde und wenn ja,
wenden wir einen Filter an. Die zweite Sache ist, dass wir den ivar nicht verwenden müssen, wir können
einfache alte lokale Variablen.

Na gut, dann. Könnten wir nicht ein Dienstobjekt verwenden, um den anfänglichen Bereich zu ändern?
Die Ausführung kann wie folgt aussehen:

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

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

        json wiedergeben: things
      end
    end
  end
end

Es sieht jetzt viel besser aus, aber natürlich müssen wir den Filter noch implementieren.
Beachten Sie, dass die Signatur des Aufrufs für alle Ressourcen gleich sein wird, so dass wir
eine generische Klasse für diese Aufgabe.

# app/services/generic/index_filter.rb

Modul Generisch
  Klasse IndexFilter
    EMPTY_HASH = {}.freeze

    def self.filters
      EMPTY_HASH
    end

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

    privat

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

    def apply_filter!(filter_key, bereich, params)
      filter = fetch_filter(filter_key)
      Bereich zurückgeben, es sei denn apply_filter?(filter, params)

      filter[:apply].call(bereich, params)
    end

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

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

Klingt kompliziert? Nicht wirklich - die ganze Magie geschieht in #apply_filters!.
Wir nehmen das Duplikat des ursprünglichen Bereichs und wenden jeden Filter darauf an.

Wenn wir den Bereich anwenden, bedeutet das, dass wir das Duplikat unseres ursprünglichen Bereichs verändern.
Und wir erwarten, dass die Filter als Hash in der selbst.Filter Methode
einer Kinderklasse. Los geht's.

# app/services/things/index_filter.rb

Modul Things
  Klasse IndexFilter (params) {
          params[:size].is_a?(String)
        },
        apply: ->(scope, params) {
          scope.where(Größe: params[:Größe])
        }
      }.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
    end
  end
end

Das war's! Wir haben mehr Code geschrieben, aber die einfachen Filter werden gleich aussehen
Weg für alle Ressourcen. Wir haben Controller aus dem Code verantwortlich gereinigt
der Filterung und stellte zu diesem Zweck eine "spezialisierte" Klasse zur Verfügung, die sehr
klare Konvention.

Angebot für Ruby-Entwickler

Lesen Sie mehr:

Vor- und Nachteile der Softwareentwicklung in Ruby

Eisenbahnen und andere Transportmittel

Rails-Entwicklung mit TMUX, Vim, Fzf + Ripgrep

Ähnliche Artikel

Software-Entwicklung

Zukunftssichere Web-Apps bauen: Einblicke vom The Codest-Expertenteam

Entdecken Sie, wie sich The Codest bei der Erstellung skalierbarer, interaktiver Webanwendungen mit Spitzentechnologien auszeichnet, die nahtlose Benutzererfahrungen auf allen Plattformen bieten. Erfahren Sie, wie unsere Expertise die digitale Transformation und...

DAS SCHÖNSTE
Software-Entwicklung

Top 10 Softwareentwicklungsunternehmen in Lettland

Erfahren Sie in unserem neuesten Artikel mehr über die besten Softwareentwicklungsunternehmen Lettlands und ihre innovativen Lösungen. Entdecken Sie, wie diese Technologieführer Ihr Unternehmen voranbringen können.

thecodest
Enterprise & Scaleups Lösungen

Grundlagen der Java-Softwareentwicklung: Ein Leitfaden für erfolgreiches Outsourcing

Entdecken Sie diesen wichtigen Leitfaden zum erfolgreichen Outsourcing der Java-Softwareentwicklung, um die Effizienz zu steigern, auf Fachwissen zuzugreifen und den Projekterfolg mit The Codest voranzutreiben.

thecodest
Software-Entwicklung

Der ultimative Leitfaden für Outsourcing in Polen

Der Anstieg des Outsourcings in Polen wird durch wirtschaftliche, bildungspolitische und technologische Fortschritte angetrieben, die das IT-Wachstum und ein unternehmensfreundliches Klima fördern.

TheCodest
Enterprise & Scaleups Lösungen

Der vollständige Leitfaden für IT-Audit-Tools und -Techniken

IT-Audits gewährleisten sichere, effiziente und gesetzeskonforme Systeme. Erfahren Sie mehr über ihre Bedeutung, indem Sie den vollständigen Artikel lesen.

Der Codest
Jakub Jakubowicz CTO & Mitbegründer

Abonnieren Sie unsere Wissensdatenbank und bleiben Sie auf dem Laufenden über das Fachwissen aus dem IT-Sektor.

    Über uns

    The Codest - Internationales Software-Unternehmen mit technischen Zentren in Polen.

    Vereinigtes Königreich - Hauptsitz

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

    Polen - Lokale Tech-Hubs

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

      Der Codest

    • Startseite
    • Über uns
    • Dienstleistungen
    • Fallstudien
    • Gewusst wie
    • Karriere
    • Wörterbuch

      Dienstleistungen

    • IT-Beratung
    • Software-Entwicklung
    • Backend-Softwareentwicklung
    • Frontend-Softwareentwicklung
    • Staff Augmentation
    • Backend-Entwickler
    • Cloud-Ingenieure
    • Daten-Ingenieure
    • Andere
    • QS-Ingenieure

      Ressourcen

    • Fakten und Mythen über die Zusammenarbeit mit einem externen Softwareentwicklungspartner
    • Aus den USA nach Europa: Warum entscheiden sich amerikanische Start-ups für eine Verlagerung nach Europa?
    • Tech Offshore Development Hubs im Vergleich: Tech Offshore Europa (Polen), ASEAN (Philippinen), Eurasien (Türkei)
    • Was sind die größten Herausforderungen für CTOs und CIOs?
    • Der Codest
    • Der Codest
    • Der Codest
    • Privacy policy
    • Website terms of use

    Urheberrecht © 2025 von The Codest. Alle Rechte vorbehalten.

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