Rails 3.2: ACCELDENZA ACCESSORI LAMBDA?
-
12-12-2019 - |
Domanda
Nei miei binari 3.2.8 App Ho alcuni ambiti di nome che vorrei catenersi insieme in alcune circostanze.
Quindi, ad esempio, ho questi due scopi:
scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) }
.
Li uso separatamente, ma vorrei anche poterli chiamarli insieme come questo:
WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02")
.
Quando provo che si lamenta che in_date_range non è un metodo di array.
Ma ho un altro scopo,
scope :active, includes([:person, :pier_module]).where("status = 'New Request'")
.
e se lo faccio
WorkRequest.active.in_date_range("2012-01-01", "2012-10-02")
.
funziona! Apparentemente l'ambito attivo restituisce una relazione, mentre gli scopi Lambda restituiscono gli array, e quindi non possono essere incatenati.
Mi piacerebbe sapere perché la differenza tra ambienti più semplici e ambiti di lambda, come i parametri lo influenzano e se c'è qualcosa che posso fare a corto di scrivere un ambito combinato, che ho fatto.
scope :by_status_in_date_range, lambda { |status, start_date, end_date| includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) }
.
funziona, ma non molto asciutto (dal momento che ho bisogno anche dei singoli scopi) o dei binari-ish. Cercando qui e altrove ho visto domande simili ma nessuna che sembra applicare a questa situazione, dove sto cercando di catenere due lambdas con parametri.
Soluzione
che succede perché nel tuo scopo
scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
.
Metodi all
e find_all_by_status
restituisce Array
invece di ActiveRecord::Relation
.Dovresti sostituirlo con where
ad esempio.
scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
.