2009-07-07 8 views
7

Ben CodeIgniter en gibi bir şey arıyorum:ActiveRecord tarafından Ruby on Rails uygulamasında gerçekleştirilen son SQL sorgusunu nasıl alabilirim?

$this->db->last_query(); 

(http://codeigniter.com/user_guide/database/helpers.html)

+0

yapmaya çalışıyorsun sen? Bunun basit olduğunu düşünmüyorum - muhtemelen ActiveRecord'ı bir yerlerde değiştirmelisiniz. Ben de böyle bir eylemin (kuşkusuz sızan) soyutlamayı kırmasından endişe duyuyorum. Yapacağınız şeyleri başarmak için daha iyi, Rails dostu bir yol olabilir. –

+0

Rails/ActiveRecord günlük seviyesi düşük olarak ayarlanmışken sorguları günlüğe kaydetmek istedim, bu yüzden sadece gerçekten ilgilendiğim sorguları görebiliyordum. Maymun yamalarının bir parçası olan Rails'in bir parçasını yamalamak için –

cevap

23

AFAIK, sorgularının listesine erişmek için kolay bir yolu yoktur. Bununla birlikte, süper basit bir kayıt cihazı oluşturarak bunlara kolayca erişebilirsiniz.

ActiveRecord::ConnectionAdapters::AbstractAdapter sınıfını açarsanız, günlük adı verilen bir yöntem görürsünüz. İfadenin günlüğe kaydedilmesi için her bir sorguda bu yöntem çağrılır. Varsayılan olarak, tüm ifadeleri Rails logger ile günlüğe kaydeder.

Sen Şimdi çalıştırılır tüm SQL sorguları içermelidir

ActiveRecord::Base.connection.last_query # => ... 
+1

+1. –

+1

Metodu tanımından sonra aramayı 'alias_method_chain''e koymam gerekiyordu, aksi halde şu hataya neden oldu:' core_ext/module/aliasing.rb: 32: 'alias_method' ': undefined method' log_with_last_query 'class' ActiveRecord :: ConnectionAdapters :: AbstractAdapter '(NameError) ' –

0

Kişisel gelişim günlüğü ile sorgu alabilirsiniz

ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do 

    attr_reader :last_query 
    alias_method_chain :log, :last_query 

    def log_with_last_query(sql, name, &block) 
    @last_query = [sql, name] 
    log_without_last_query(sql, name, &block) 
    end 

end 

gibi bir şey yapabilirsiniz.

+0

Evet, ama işte bu - Sorunun TÜMÜ var. Sadece açık bir şekilde ne kaydettiğimi görmek istiyorum. –

2

Muhtemelen ActiveRecord'un daha yeni bir sürümüne sahip olduğum için bu soru sorulduğunda, ancak ActiveRecord 3.2.3 ile çalışmaya başlamak için Simone Carletti komut dosyasını güncelledim: Ek özniteliği binds ekledim ve aramayı Yöntem tanımının altında alias_method_chain, aksi halde yöntemi bulamadığını söyleyen bir hata oluşturur.

ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do 

    attr_reader :last_query 

    def log_with_last_query(sql, name, binds=[], &block) 
    @last_query = [sql, name] 
    log_without_last_query(sql, name, binds, &block) 
    end 
    alias_method_chain :log, :last_query 

end 

son sorgu aynı hala Başlarken:

ActiveRecord::Base.connection.last_query # => ...