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.
Leave a Reply