Tag: Rails3

Rails3, Apache + Passenger (mod Rails), send_file i pusty plik

Zauważyłem ostatnio, że send_file w Rails3 nie działa tak jak trzeba na serwerze Apache. Problem był taki, że Railsy które miały serwować plik 5MB, serwowały pusty plik.

Działo się tak tylko w środowisku produkcyjnym, więc dość ciężko było znaleźć przyczynę. Na co dzień developerkę robię na Mongrelu, pod którym wszystko działało normalnie.

Na szczęście rozwiązanie tego problemu okazało się bardzo proste. Nie na każdym serwerze można wysyłać pliki, oddelegowując je przez X-Sendfile. Wygląda na to że Rails "puszczał" nagłówek w stronę serwera, a ten po prostu go przekazywał.

Aby rozwiązać ten problem, wystarczy w pliku config/production.rb odznaczyć (zakomentować) następującą linijkę:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

Po zakomentowaniu tego, Railsy będą wysyłały pliki w standardowy sposób.

ActiveRecord – pobieranie losowego elementu (rekordu) z modelu

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.

Copyright © 2025 Closer to Code

Theme by Anders NorenUp ↑