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.

È stato utile?

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" }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top