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
on 2013-10-22 19:36
on 2013-10-22 19:48

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.
on 2013-10-22 19:51

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>
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
on 2013-10-23 11:42

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/