Forum: Italian Ruby user group RANDOM query per Mysql e Postgresql

2922e324de4340e97d654bb27396f0d7?d=identicon&s=25 Alberto Bissacco (albyb)
on 2013-10-22 19:36
Ciao a tutti, nella mia applicazione voglio visualizzare in hp un'
immagine presa a casa dal db.

In development uso Mysql, mentre in production (heroku) uso Postgresql e
ho scoperto, da bel neofita, che le query è differente per i due
database:
- per Mysql si usa RANDOM => es: Photo.order("RAND()").first
- per Pg si usa RAND => es: Photo.order("RANDOM()").first

Cercando in internet ho trovato questa semplice e pulita query che
risolve il problema e che va bene per entrambi gli enviroment:

@photo = Photo.find :first, :offset => rand(Photo.count)

Come vi comportate voi? è il modo migliore?
Grazie in anticipo a chiunque mi risponderà.

Alberto
Cb8e3a1650513848561ca38f84399fa1?d=identicon&s=25 Fabrizio Regini (freegenie)
on 2013-10-22 19:48
(Received via mailing list)
In teoria ActiveRecord dovrebbe fungere da astrazione, ed  cos infatti
nella maggior parte dei casi.
Se sei un neofita ti direi di non preoccuparti troppo della tipologia di
database sottostante, ma ti sei reso conto da solo che ci sono delle
differenze tra i vari database che possono uscire fuori.
Spesso sono evidenti come in questo caso, in altre situazioni sono meno
evidenti e ti possono far perdere tempo con bug e comportamenti
inaspettati.
Pi  complesso il progetto, pi di frequente avrai bisogno di allontanarti
dalle funzionalit di ActiveRecord per fare delle query a mano o usare
feature particolari del database.

Nel caso specifico direi che la soluzione va pi che bene, mi hai fatto
ricordare del parametro :offset che non  uso tanto spesso.
99e0b39c091e10d9c7d4452a34ca52dc?d=identicon&s=25 Simone Carletti (weppos)
on 2013-10-22 19:51
(Received via mailing list)
A prescindere dal fatto che ti consiglio di usare in sviluppo lo stesso
ambiente di sviluppo, non c' una soluzione definitiva

Entrambe hanno pro e contro. Personalmente, se il data set  limitato io
uso in genere

Photo.find Photo.pluck(:id).sample

Photo.pluck mi ritorna tutte le primary key in un array, sample ne
sceglie
una random.

-- Simone

On Tuesday, October 22, 2013, Alberto Bissacco wrote:

> risolve il problema e che va bene per entrambi gli enviroment:
> _______________________________________________
> Ml mailing list
> Ml@lists.ruby-it.org <javascript:;>
> http://lists.ruby-it.org/mailman/listinfo/ml
>


--
Simone Carletti
Passionate programmer and dive instructor

http://www.simonecarletti.com/
Twitter: @weppos <https://twitter.com/weppos>
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2013-10-23 11:29
Alberto, la tua query mi pare la migliore perché funziona bene anche con
tanti record, ma è un peccato dover passare per la select count.

Il mio consiglio è usare lo stesso database sia in sviluppo che in
produzione. Usandone due diversi prima o poi accadrà un guaio, se non
hai anche un sistema di test con lo stesso db di produzione.
ActiveRecord astrae bene sui db ed Heroku contribuisce a nascondere il
database, però ti esponi a tutti i bug di AR che dipendono dal db
sottostante (ce ne sono stati, ce ne saranno) e soprattutto alle
differenti opinioni dei due db sui risultati di certe query (trattamento
dei null, date, unique values nelle transazioni, etc). In parole povere,
i tuoi test che passano su mysql potrebbero non passare su postgresql e
viceversa.

Con lo stesso database oltre a dormire più tranquillo potrai usare la
RANDOM() di postgresql che mi aspetto produca una query più veloce della
combinazione delle due che usi adesso, ma va verificato.

Ciao
Paolo
9daa9b4739a6e95078cbcfb624d7bb8e?d=identicon&s=25 David Welton (Guest)
on 2013-10-23 11:42
(Received via mailing list)
2013/10/23 Paolo Montrasio <paolo@paolomontrasio.com>:
> Alberto, la tua query mi pare la migliore perch funziona bene anche con
> tanti record, ma  un peccato dover passare per la select count.

http://stackoverflow.com/questions/5297396/quick-r...

A quanto pare potrebbe essere meglio un count che un random(), ma
bisogna analizzare tutti e due i query, e tener conto della quantita`
di dati...

--
David N. Welton

http://www.welton.it/davidw/

http://www.dedasys.com/
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.