2017-02-10 17 views
1

私は電源を入れてオフにしようとしていますraw SQLを使用してactiverecordの単一クエリに対してpostgresql enable_nestloopを問い合せています。ここでのコマンドは、私がはActiveRecord :: Base.connection.execute(S).to_aを呼び出すと、それは任意のレコードを返し、エラーをスローしませんrails-5 activerecord postgresql-9.6単一のSQLクエリのenable_nestloop

class Segment < ApplicationRecord 
    def self.count_payload_kind 

    s = " 

     SET LOCAL enable_nestloop = off; 

     SELECT count(*) 
     FROM segments s 
     WHERE s.payload @> '[{\"kind\":\"person\"}]'; 

     SET LOCAL enable_nestloop = on; 
    " 

    ActiveRecord::Base.connection.execute(s).to_a 

    end 
end 

です。ただし、2つの呼び出しを削除すると正しく動作しますSET LOCAL enable_nestloop

1つのクエリに対してenable_nestloopをオンまたはオフにするにはどうすればよいですか。

答えて

1

私はRails 4.2.6とpostgresql 9.5.4のテストから、トランザクションを呼び出してラッピングすることができます。

result = ActiveRecord::Base.transaction do 
    ActiveRecord::Base.connection.execute("SET LOCAL enable_nestloop = off;") 
    r = ActiveRecord::Base.connection.execute(" 
    SELECT count(*) 
     FROM projects 
    WHERE active; 
    ") 
    ActiveRecord::Base.connection.execute("SET LOCAL enable_nestloop = on;") 
    r 
end 

result.values.flatten 
=> ["1"] 

SQL出力

(4.3ms) BEGIN 
(6.8ms) SET LOCAL enable_nestloop = off; 
(98.3ms) 
    SELECT count(*) 
    FROM projects 
    WHERE active; 

(3.1ms) SET LOCAL enable_nestloop = on; 
(3.0ms) COMMIT 
+0

感謝します。できます。賞金を授与しようとしたが、私は7時間待つべきだと言った。私は時間が経過したらそれを授与します。 – brg

関連する問題