Chciałbym zobaczyć instrukcję SQL, którą wygeneruje dane zapytanie ActiveRecord. Rozumiem, że mogę uzyskać te informacje z dziennika po wysłaniu zapytania, ale zastanawiam się, czy istnieje metoda, którą można wywołać i kwerendę ActiveRecord.
Na przykład:
SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
Chciałbym otworzyć konsolę irb i na końcu przypisać metodę, która pokaże SQL, które wygeneruje to zapytanie, ale niekoniecznie wykona zapytanie.
źródło
date
,: select => "DISTINCT (*)" ,: conditions => [" > # {self.date}"],: limit => 1 ,: order => 'date
',: group => "date
") .show_generated_sql i wywołaj metodę construct_finder_sql.show_generated_sql
będzie działać na już pobranym zbiorze danych zfind
.construct_finder_sql
rzeczywiście został usuniętyPodobne do pengera, ale działa w konsoli w dowolnym momencie, nawet po załadowaniu klas i zbuforowaniu rejestratora:
Dla szyn 2:
Dla Rails 3.0.x:
Dla Railsów> = 3.1.0 jest to już zrobione domyślnie w konsolach. Jeśli jest zbyt głośny i chcesz go wyłączyć , możesz zrobić:
źródło
rails console
. Czy działa tylko dla irb ładowanego bezpośrednio z powłoki? (czy też został usunięty z torów 3?)environment.rb
...if "irb" == $0;ActiveRecord::Base.logger = Logger.new(STDOUT);end
..zapomniałem to z komentarzy w http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do -it-s-thingTrzymać
puts query_object.class
gdzieś zobaczyć, jaki rodzaj obiektu Twój pracy z, a następnie odnośnika docs.Na przykład w Railsach 3.0 zakresy używają metody,
ActiveRecord::Relation
która ma#to_sql
metodę. Na przykład:Następnie gdzieś możesz zrobić:
źródło
includes
w swoim związkuTo może być stare pytanie, ale używam:
explain
Metoda daje dość szczegółową instrukcję SQL na co jej zrobiźródło
po prostu użyj
to_sql
metody, a wyświetli zapytanie sql, które zostanie uruchomione. działa na relacji rekordu aktywnego.jeśli to zrobisz
find
, nie zadziała, więc musisz ręcznie dodać ten identyfikator do zapytania lub uruchomić go za pomocą where.źródło
To jest to, co zwykle robię, aby wygenerować SQL w konsoli
Musisz to zrobić przy pierwszym uruchomieniu konsoli, jeśli zrobisz to po wpisaniu kodu, wydaje się, że nie działa
Nie mogę tego przypisać, znalazłem to dawno temu na czyimś blogu i nie pamiętam, kto to jest.
źródło
Utwórz plik .irbrc w swoim katalogu domowym i wklej go w:
Spowoduje to wyświetlenie instrukcji SQL w sesji irb.
EDYCJA: Przepraszam, że nadal wykona zapytanie, ale jest najbliższe, o którym wiem.
EDYCJA: Teraz z arel, możesz budować zakresy / metody tak długo, jak obiekt zwraca ActiveRecord :: Relation i wywołuje na nim .to_sql, a wyjdzie sql, który ma zostać wykonany.
źródło
Moim typowym sposobem sprawdzenia, jakiego sql używa, jest wprowadzenie "błędu" do sql, wtedy otrzymasz komunikaty o błędach wypluwane do normalnego rejestratora (i ekranu WWW), który ma problem z sql. Nie ma potrzeby, aby dowiedzieć się, dokąd zmierza stdout ...
źródło
Wypróbuj wtyczkę show_sql . Wtyczka umożliwia drukowanie kodu SQL bez uruchamiania go
źródło
Możesz zmienić metodę dziennika połączenia, aby zgłosić wyjątek, uniemożliwiając uruchomienie zapytania.
To totalny hack, ale wydaje mi się, że działa dla mnie (Rails 2.2.2, MySQL):
źródło
W Railsach 3 możesz dodać tę linię do config / environment / development.rb
Jednak wykona zapytanie. Ale połowa dostała odpowiedź:
źródło