RANDOM query per Mysql e Postgresql

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

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.

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 B. wrote:

risolve il problema e che va bene per entrambi gli enviroment:


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


Simone C.
Passionate programmer and dive instructor

Twitter: @weppos https://twitter.com/weppos

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

2013/10/23 Paolo M. [email protected]:

Alberto, la tua query mi pare la migliore perch funziona bene anche con
tanti record, ma un peccato dover passare per la select count.

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/