24 Nov
duccio

duccio il 24 November 2008 parla di Rails Snippet

Rails: usare il RAND() con database diversi da MySQL

Usare il RAND() nell’order di ActiveRecord è comodo in quanto si sfrutta una funzione di SQL per restituire i record ordinati randomicamente.

Se però usate Postgres o SQlite come database si genera un errore in quanto questi ultimi non usano la funzione RAND() ma RANDOM().

Per ovviare al problema potete definire un simbolo :random che all’occorrenza diventa RAND() o RANDOM().

    1 module ActiveRecord::ConnectionAdapters
    2   class AbstractAdapter  
    3     def order(order)
    4       if order.class == Symbol
    5         case order
    6           when :random then "RANDOM()"
    7           else order.to_s
    8         end
    9       else
   10         order
   11       end
   12     end
   13   end
   14 end
   15 
   16 module ActiveRecord::ConnectionAdapters
   17   class MysqlAdapter  
   18     def order(order)
   19       if order.class == Symbol
   20         case order
   21           when :random then "RAND()"
   22           else order.to_s
   23         end
   24       else
   25         order
   26       end
   27     end
   28   end
   29 end

A questo punto nella vostra query potete sostituire:

    1 Model.find(:all, :order => "RAND()")

con questa:

    1 Model.find(:all, :order => :random)

dove :random sarà RAND() quando usate MySQL e RANDOM() negli altri casi.

1 Commento a “Rails: usare il RAND() con database diversi da MySQL”

  1. Tex il 26 November 2008 alle 08:49 dice:

    Grazie Duccio, veramente utile !

Scrivi un commento