Kolejna krótka notka.

Tym razem nt tego jak pobierać losowy element (rekord) z modelu.

Najprościej jest skorzystać z kodu który krąży po necie od dawien dawna:

      def self.random
        find(:first, :order => "RAND()")
      end

Ma on jednak jedną wadę. Cachowanie Railsowego go psuje. Tzn że jeśli Railsy cachują zapytania i wykonamy dwa razy tę metodę, w obrębie jednego żądania – to wylosuje nam ten sam element. Rozwiązaniem tego jest wykorzystanie parametry created_at w taki oto sposób:

      def self.random
        find(:first, :order => "RAND()", :conditions => "created_at < '#{Time.now.to_s(:db)}'")
      end

co wymusi każdorazowo wykonanie nowego zapytania, ponieważ znacznik czasu będzie inny.