window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = finestra if (w.LeadBooster) { console.warn('LeadBooster esiste già') } 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 }) }, } } })() Filtri semplici in Rails API - The Codest
The Codest
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Industrie
    • Fintech e banche
    • E-commerce
    • Adtech
    • Tecnologia della salute
    • Produzione
    • Logistica
    • Automotive
    • IOT
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
Freccia indietro TORNA INDIETRO
2022-02-23
Sviluppo di software

Filtri semplici in Rails API

The Codest

Krzysztof Buszewicz

Senior Software Engineer

Siete arrabbiati ogni volta che vedete mutare le variabili di istanza nel controller di rails per filtrare i dati? Questo articolo è per voi. 🙂

Filtri

Probabilmente l'avete già visto:

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

modulo API
  modulo V1
    classe ThingsController < BaseController
      def index
        @cose = 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: @cose
      fine
    fine
  fine
fine

Perché lo considero un cattivo codice? Perché fa semplicemente ingrassare il nostro controllore.
IMHO dovremmo estrarre la maggior parte della logica possibile dai controllori e utilizzare un sistema di
o servizi. In questo caso implementeremo un filtro generico che sarà in grado di
da utilizzare su più controllori.

Ma prima analizziamo il codice attuale. Può essere brutto ma funziona.
Abbiamo un ambito iniziale (Cosa.tutti) e poi lo limitano se l'utente ha superato
relativo a un parametro. Per ogni filtro controlliamo se il parametro è stato passato e, in caso affermativo, se è stato passato,
applichiamo un filtro. La seconda cosa è che non abbiamo bisogno di usare ivar, possiamo usare
le vecchie variabili locali.

Ok, allora. Non si potrebbe usare un oggetto di servizio per mutare l'ambito iniziale?
L'esecuzione può essere simile a questa:

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

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

        rende json: things
      fine
    fine
  fine
fine

Ora l'aspetto è molto migliore, ma ovviamente dobbiamo ancora implementare il filtro.
Si noti che la firma della chiamata sarà la stessa per tutte le risorse, quindi si può avere
una classe generica per questo compito.

# app/services/generic/index_filter.rb

modulo Generic
  classe IndexFilter
    EMPTY_HASH = {}.freeze

    def self.filters
      VUOTO_HASH
    fine

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

    privato

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

    def apply_filter!(filter_key, scope, params)
      filtro = fetch_filtro(chiave_filtro)
      restituisce l'ambito a meno che apply_filter?(filter, params)

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

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

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

Sembra complicato? Non proprio: tutta la magia avviene in #apply_filters!.
Prendiamo il duplicato dell'ambito iniziale e vi applichiamo ogni filtro.

Quando applichiamo l'ambito, significa che mutiamo il duplicato dell'ambito iniziale.
E ci aspettiamo che i filtri siano implementati come un hash nel file self.filters metodo
di una classe figlio. Facciamolo.

# app/services/things/index_filter.rb

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

    def self.filters
      FILTRI
    fine
  fine
fine

Ecco fatto! Abbiamo scritto più codice, ma i filtri semplici avranno lo stesso aspetto
per tutte le risorse. Abbiamo ripulito il controllore dal codice responsabile
di filtraggio e ha fornito una classe "specializzata" per questo scopo che segue molto
convenzione chiara.

Offerta per sviluppatori Ruby

Per saperne di più:

Pro e contro dello sviluppo software in Ruby

Rotaie e altri mezzi di trasporto

Sviluppo di Rails con TMUX, Vim, Fzf + Ripgrep

Articoli correlati

Sviluppo di software

Costruire applicazioni web a prova di futuro: le intuizioni del team di esperti di The Codest

Scoprite come The Codest eccelle nella creazione di applicazioni web scalabili e interattive con tecnologie all'avanguardia, offrendo esperienze utente senza soluzione di continuità su tutte le piattaforme. Scoprite come la nostra esperienza favorisce la trasformazione digitale e il business...

IL CANCRO
Sviluppo di software

Le 10 principali aziende di sviluppo software con sede in Lettonia

Scoprite le migliori aziende di sviluppo software della Lettonia e le loro soluzioni innovative nel nostro ultimo articolo. Scoprite come questi leader tecnologici possono aiutarvi a migliorare la vostra attività.

thecodest
Soluzioni per aziende e scaleup

Essenziali di sviluppo software Java: Guida all'outsourcing di successo

Esplorate questa guida essenziale sullo sviluppo di software Java con successo outsourcing per migliorare l'efficienza, accedere alle competenze e guidare il successo del progetto con The Codest.

thecodest
Sviluppo di software

La guida definitiva all'outsourcing in Polonia

L'aumento di outsourcing in Polonia è guidato dai progressi economici, educativi e tecnologici, che favoriscono la crescita dell'IT e un clima favorevole alle imprese.

IlCodesto
Soluzioni per aziende e scaleup

Guida completa agli strumenti e alle tecniche di audit IT

Gli audit IT garantiscono sistemi sicuri, efficienti e conformi. Per saperne di più sulla loro importanza, leggete l'articolo completo.

The Codest
Jakub Jakubowicz CTO e cofondatore

Iscrivetevi alla nostra knowledge base e rimanete aggiornati sulle competenze del settore IT.

    Chi siamo

    The Codest - Società internazionale di sviluppo software con centri tecnologici in Polonia.

    Regno Unito - Sede centrale

    • Ufficio 303B, 182-184 High Street North E6 2JA
      Londra, Inghilterra

    Polonia - Poli tecnologici locali

    • Parco uffici Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Ambasciata del cervello, Konstruktorska
      11, 02-673 Varsavia, Polonia

      The Codest

    • Casa
    • Chi siamo
    • Servizi
    • Case Studies
    • Sapere come
    • Carriera
    • Dizionario

      Servizi

    • Consulenza
    • Sviluppo di software
    • Sviluppo backend
    • Sviluppo Frontend
    • Staff Augmentation
    • Sviluppatori backend
    • Ingegneri del cloud
    • Ingegneri dei dati
    • Altro
    • Ingegneri QA

      Risorse

    • Fatti e miti sulla collaborazione con un partner esterno per lo sviluppo di software
    • Dagli Stati Uniti all'Europa: Perché le startup americane decidono di trasferirsi in Europa
    • Confronto tra gli hub di sviluppo Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filippine), Eurasia (Turchia)
    • Quali sono le principali sfide di CTO e CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condizioni di utilizzo del sito web

    Copyright © 2025 di The Codest. Tutti i diritti riservati.

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