2017-08-28 4 views
9

に摘み取りますそれぞれの方法。 selectメソッドがActiveRecord::Relationを返すとすれば、to_sqlメソッドを呼び出すことができます。しかし、結果が配列の場合、ActiveRecord::Relationオブジェクトのpluck操作から派生したSQL文を取得する方法を理解することはできません。ActiveRecordのは、私はこれらの二つの文は同じSQLを実行知っているSQL

これは問題の簡略化であることを考慮してください。抜き取られる属性の数は、任意に高くすることができる。

ご協力いただければ幸いです。

+2

あなたがTRYI何ですかやりたい? ['pluck'](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/calculations.rb#L177)は' select'と同じSQLクエリを使いますが、 '' 'ActiveRecord :: Relation'の代わりに配列を返すためには' cast_values'](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/result.rb#L99)を参照してください。 – cschroed

+0

私はユーザ入力に基づいてクエリを構築しています。実際に実行されているクエリについてのフィードバックを提供したいと思います。 – Bustikiller

答えて

8

あなたpluckができないチェーンto_sqlそれはActiveRecord::relationを返さないと。あなたがしようとした場合、それはとても

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

のような例外をスローし、私はActiveRecordの上で摘む 操作から派生したSQL文を取得する方法を見つけ出すことができません::関係オブジェクトを、そのことを考えると 配列です。 が@cschroedとして

まあ、は、彼らは両方(selectpluck同じSQLがを照会実行し、コメントで指摘しました。唯一の違いはpluckActiveRecord::Relationの代わりにarrayを返すことです。 pluckあまりに

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

のための同じ

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

はあなたが摘み取るしようとしているどのように多くの属性問題ではないこと、SQLステートメントがselect

例と同じになりますだから、selectによって返されたSQLステートメントを取るだけで、それはと同じであると信じる必要があります。それでおしまい!

2

あなたはActiveRecord::LogSubscriberクラスを猿パッチと任意のアクティブレコードクエリ、ActiveRecord::Relationオブジェクトを返さないものも含め登録しますシングルトン提供することができます:あなたが照会

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 

が実行:

User.all.pluck(:email) 
をその後

、クエリを取得する:

QueriesRegister.instance.queries 
+0

'queries'配列はいつ空になりますか? – Bustikiller

+0

さて、あなたは '#flush'メソッドで自分自身を制御する必要があります –

関連する問題