2017-02-10 22 views
1

我試圖打開和關閉postgresql enable_nestloop對於使用原始SQL的activerecord中的單個查詢。下面是一個命令rails-5 activerecord postgresql-9.6 enable_nestloop對於單個sql查詢

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 

當我打電話的ActiveRecord :: Base.connection.execute(S).to_a,它不返回任何記錄,並拋出任何錯誤。但是,它工作正常,如果我刪除了2個電話SET LOCAL enable_nestloop

如何打開和關閉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