window.pipedriveLeadboosterConfig = { basis: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versie: 2, } ;(functie () { var w = venster als (w.LeadBooster) { console.warn('LeadBooster bestaat al') } anders { w.LeadBooster = { q: [], on: functie (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: functie (n) { this.q.push({ t: 't', n: n }) }, } } })() Eenvoudige filters in Rails API - The Codest
The Codest
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Industrie
    • Fintech & Bankieren
    • E-commerce
    • Adtech
    • Gezondheidstechnologie
    • Productie
    • Logistiek
    • Automotive
    • IOT
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
Pijl terug KEREN TERUG
2022-02-23
Software Ontwikkeling

Eenvoudige filters in Rails API

The Codest

Krzysztof Buszewicz

Senior Software Engineer

Ben je elke keer boos als je mutating instance variables in rails controller ziet om gegevens te filteren? Dit artikel is voor jou. 🙂

Filters

Je hebt dit waarschijnlijk al eerder gezien:

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

module API
  module V1
    klasse ThingsController < BaseController
      def index
        @things = Ding.alle
        @things = @things.where(size: params[:size]) if params[:size]
        @things = @things.where('name ILIKE ?', "%#{params[:naam_bevat]}%") if params[:naam_bevat]

        json weergeven: @dingen
      einde
    einde
  einde
einde

Waarom beschouw ik het als een slechte code? Omdat het onze controller gewoon vet maakt.
IMHO moeten we zoveel mogelijk logica uit controllers halen en een doelgerelateerde
utils of services. In dit geval implementeren we een generiek filter waarmee we
te gebruiken op veel controllers.

Maar wacht, laten we eerst de huidige code analyseren. Het kan slecht zijn, maar het werkt wel.
We hebben wat initiële reikwijdte (Ding.alle) en dan beperken als de gebruiker geslaagd is voor
gerelateerde parameter. Voor elk filter controleren we of de parameter is doorgegeven en zo ja,
passen we een filter toe. Het tweede is dat we de ivar niet hoeven te gebruiken, we kunnen gebruik maken van
gewone oude lokale variabelen.

Oké, dan. Kunnen we niet een serviceobject gebruiken om de initiële scope te muteren?
De uitvoering kan er als volgt uitzien:

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

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

        json weergeven: things
      einde
    einde
  einde
einde

Het ziet er nu veel beter uit, maar we moeten het filter natuurlijk nog implementeren.
Merk op dat de handtekening van de oproep hetzelfde zal zijn voor alle bronnen, dus we kunnen
een generieke klasse voor deze taak.

# app/services/generiek/index_filter.rb

module Algemeen
  klasse IndexFilter
    EMPTY_HASH = {}.freeze

    def self.filters
      EMPTY_HASH
    einde

    def aanroep(bereik, params)
      pas_filters toe!(self.class.filters.keys, bereik, params)
    einde

    privé

    def pas_filters toe!(filter_keys, bereik, params)
      filter_keys.inject(scope.dup) do |current_scope, filter_key|
        pas_filter!(filter_key, huidige_scope, params) toe
      einde
    einde

    def apply_filter!(filter_key, scope, params)
      filter = fetch_filter(filter_key)
      scope terug tenzij apply_filter?(filter, params)

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

    def toepassen_filter?(filter, params)
      filter[:toepassen?].aanroepen(params)
    einde

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

Lijkt het ingewikkeld? Niet echt - alle magie gebeurt in #oe_filters!.
We nemen het duplicaat van de initiële scope en passen er elk filter op toe.

Als we de scope toepassen, betekent dit dat we het duplicaat van onze initiële scope muteren.
En we verwachten dat filters worden geïmplementeerd als een hash in de zelf.filters methode
van een kindklasse. Laten we het doen.

# app/services/dingen/index_filter.rb

module Dingen
  klasse IndexFilter (params) {
          params[:size].is_a?(String)
        },
        toepassen: ->(scope, params) {
          scope.where(size: params[:size])
        }
      }.freeze,
      naam_bevat_filter: {
        toepassen?: ->(params) {
          params[:naam_bevat].is_een?(String)
        },
        toepassen: ->(scope, params) {
          scope.where("name ILIKE ?", "%#{params[:naam_bevat]}%")
        }
      }.freeze
    }.bevriezen

    def self.filters
      FILTERS
    einde
  einde
einde

Dat is het! We hebben meer code geschreven, maar de eenvoudige filters zien er hetzelfde uit
manier voor alle bronnen. We hebben de controller uit de verantwoordelijke code verwijderd
van filteren en leverde hiervoor een 'gespecialiseerde' klasse die zeer
duidelijke conventie.

Ruby Ontwikkelaar Aanbod

Lees meer:

Voor- en nadelen van Ruby softwareontwikkeling

Rails en andere transportmiddelen

Rails ontwikkelen met TMUX, Vim, Fzf + Ripgrep

Verwante artikelen

Software Ontwikkeling

Bouw Toekomstbestendige Web Apps: Inzichten van The Codest's Expert Team

Ontdek hoe The Codest uitblinkt in het creëren van schaalbare, interactieve webapplicaties met geavanceerde technologieën, het leveren van naadloze gebruikerservaringen op alle platforms. Ontdek hoe onze expertise digitale transformatie en business...

DE BESTE
Software Ontwikkeling

Top 10 in Letland gevestigde bedrijven voor softwareontwikkeling

Lees meer over de beste softwareontwikkelingsbedrijven van Letland en hun innovatieve oplossingen in ons nieuwste artikel. Ontdek hoe deze technologieleiders uw bedrijf kunnen helpen verbeteren.

thecodest
Oplossingen voor ondernemingen en schaalvergroting

Essentiële Java-softwareontwikkeling: Een gids voor succesvol uitbesteden

Verken deze essentiële gids over succesvolle outsourcing Java-softwareontwikkeling om de efficiëntie te verbeteren, toegang te krijgen tot expertise en projectsucces te stimuleren met The Codest.

thecodest
Software Ontwikkeling

De ultieme gids voor outsourcing in Polen

De sterke groei van outsourcing in Polen wordt gedreven door economische, educatieve en technologische vooruitgang, die IT-groei en een bedrijfsvriendelijk klimaat stimuleert.

DeCodest
Oplossingen voor ondernemingen en schaalvergroting

De complete gids voor IT-auditmiddelen en -technieken

IT-audits zorgen voor veilige, efficiënte en compliant systemen. Lees het volledige artikel om meer te weten te komen over het belang ervan.

The Codest
Jakub Jakubowicz CTO & medeoprichter

Abonneer je op onze kennisbank en blijf op de hoogte van de expertise uit de IT-sector.

    Over ons

    The Codest - Internationaal softwareontwikkelingsbedrijf met technische hubs in Polen.

    Verenigd Koninkrijk - Hoofdkantoor

    • Kantoor 303B, 182-184 High Street North E6 2JA
      Londen, Engeland

    Polen - Lokale technologieknooppunten

    • Fabryczna kantorenpark, Aleja
      Pokoju 18, 31-564 Krakau
    • Hersenambassade, Konstruktorska
      11, 02-673 Warschau, Polen

      The Codest

    • Home
    • Over ons
    • Diensten
    • Case Studies
    • Weten hoe
    • Carrière
    • Woordenboek

      Diensten

    • Het advies
    • Software Ontwikkeling
    • Backend ontwikkeling
    • Frontend ontwikkeling
    • Staff Augmentation
    • Backend ontwikkelaars
    • Cloud Ingenieurs
    • Gegevensingenieurs
    • Andere
    • QA ingenieurs

      Bronnen

    • Feiten en fabels over samenwerken met een externe partner voor softwareontwikkeling
    • Van de VS naar Europa: Waarom Amerikaanse startups besluiten naar Europa te verhuizen
    • Tech Offshore Ontwikkelingshubs Vergelijking: Tech Offshore Europa (Polen), ASEAN (Filippijnen), Eurazië (Turkije)
    • Wat zijn de grootste uitdagingen voor CTO's en CIO's?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Gebruiksvoorwaarden website

    Copyright © 2025 door The Codest. Alle rechten voorbehouden.

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