Calcoli su activerecord

Ho il seguente problema.

Semplificando ho un metodo che esegue una query su un activerecord in
due step: prima fa una where (in realtà parametrizzata) e poi fa dei
calcoli su un attributo :

def foo
res = Sale.where(product: 5, …)
res.sum(:turnover)
end

Anche il secondo step (dalla quale foglio ottenere un valore numerico) è
customizzabile, vorrei potere fare anche (ad esempio):

res.sum(:turnover) / res.sum(:taking)

Quello che mi viene in mente è passare un blocco, ovvero poter fare una
cosa tipo questa:

def foo(&block)
res = Sale.where(product: 5, …)
res &block
end

foo do |res|
res.sum(:turnover) / res.sum(:taking)
end

in cui la funzione da applicare al risultato della query viene passata
come blocco, ma non ho trovato modo di passare un blocco ad
activerecord…

Qualche idea?

Buona giornata,
iwan

a occhio, una cosa del genere potrebbe andare:

def foo
res = Sale.where(product: 5, …)
yield res if block_given? # yield di res se passi un blocco

res # ritorna res comunque
end

foo do |res|
res.sum(:turnover) / res.sum(:taking)
end

ciao,
A.

Tralascio l’errore macroscopico (mio) nel ripassare il blocco…

Non va, foo in questo caso mi ritorna un oggetto ActiveRecord::Relation
(esito della sola query)

2015-03-24 10:40 GMT+01:00 Andrea P. [email protected]:

Allore devi far si che la funzione restituisca il risultato dello
yield. Ed esigere ovviamente che venga passato un blocco.

2015-03-24 10:46 GMT+01:00 Iwan B. [email protected]:

No. Il nocciolo della questione non il blocco.
Ma la possibilit di passare un blocco ad ActiveRecord::Relation

Semplificando la domanda:

Sale.where(product: 5, …) do |res|
res.sum(:revenue) / res.sum(:collected)
end

C’ un modo di passare un blocco in coda ad una where?

Il giorno 24 marzo 2015 10:56, Fabrizio R. [email protected] ha
scritto:

Ottimo, è quello che cercavo.

Grazie!

Il giorno 24 marzo 2015 14:54, Andrea P. [email protected] ha
scritto:

forse questo fa al caso tuo:

dovrebbe essere una cosa del genere:

Sale.where(product: 5, ).scoping do
Sale.sum(:revenue) / Sale.sum(:collected
end

in pratica, crea uno scope a runtime.

ciao,
A.

Tralascio l’errore macroscopico (mio) nel ripassare il blocco…

yield res if block_given? # yield di res se passi un blocco
A.

Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml