2017-08-28 89 views
9

SQL koparmak her bir yöntem. select yönteminin bir ActiveRecord::Relation döndürdüğü göz önüne alındığında, to_sql yöntemini çağırabilirim. Ancak, sonuç bir dizi olduğu için, ActiveRecord::Relation nesnesindeki bir çoğaltma işleminden türetilen SQL deyimini nasıl alacağımı anlayamıyorum.ActiveRecord Ben bu iki ifadenin aynı SQL gerçekleştirmek biliyorum

Lütfen sorunun basitleştirildiğini göz önünde bulundurun. Koparılan özelliklerin sayısı keyfi yüksek olabilir.

Herhangi bir yardım için teşekkür ederiz.

+2

sen tryi ne ng yapmak? ['pluck'] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/calculations.rb#L177)' select' ile aynı SQL sorgusunu kullanır, ancak cast_values'] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/result.rb#L99) bir ActiveRecord :: İlişkisi yerine bir dizi döndürmek için. – cschroed

+0

Kullanıcı girdisine dayalı bir sorgu yapıyorum ve gerçekte yürütülen sorgu hakkında geri bildirim sağlamak istiyorum – Bustikiller

cevap

8

Sen o ActiveRecord::relation dönmez değil zincir to_sqlpluck ile gibi. Yapmanız denerseniz, sonuç göz önüne alındığında ben bir ActiveRecord :: İlişkisi nesne üzerinde bir koparmak operasyonda elde edilen SQL deyimi nasıl bilemiyorum böylece

NoMethodError: undefined method `to_sql' for [[""]]:Array 

gibi bir istisna, atar bir dizidir. @cschroed olarak

Eh, ikisi de (select ve pluck) aynı SQL sorguları gerçekleştirmek yorumlardaki dikkat çekti. Tek fark, pluck'un ActiveRecord::Relation yerine array döndürmesidir. Bu Eğer koparmak çalışıyoruz kaç özelliklerini fark etmez, SQL deyimi olacaktır aynı

select olarak Örnek: pluck çok

User.all.pluck(:first_name,:email) 
#=> SELECT "users"."first_name", "users"."email" FROM "users" 

için

User.select(:first_name,:email) 
#=> SELECT "users"."first_name", "users"."email" FROM "users" 

aynı Yani, sadece select tarafından döndürülen SQL deyimini almanız ve bununiçin aynı olduğuna inanıyorum.. Bu kadar!

2

Sen ActiveRecord::LogSubscriber sınıfını maymun yama ve herhangi bir etkin kaydı sorguları, ActiveRecord::Relation nesneleri dönmez bile olanları kayıt altına alacak a tek sağlayabilir:

class QueriesRegister 
    include Singleton 
    def queries 
    @queries ||= [] 
    end 

    def flush 
    @queries = [] 
    end 
end 

module ActiveRecord 
class LogSubscriber < ActiveSupport::LogSubscriber 

    def sql(event) 
    QueriesRegister.instance.queries << event.payload[:sql] 
    "#{event.payload[:name]} (#{event.duration}) #{event.payload[:sql]}"  
    end 
end 
end 

Run sorgulayabilir:

User.all.pluck(:email) 

Sonra sorguları almak için:

QueriesRegister.instance.queries 
+0

"Sorgular" dizisi ne zaman boşaltılacak? – Bustikiller

+0

Peki ... Kendinizi "# flush" yöntemiyle kontrol etmeniz gerekiyor –