2017-04-20 24 views
0

我們將數據庫從sqlite3遷移到了postgreSQL。現在,在下面的行中,我們得到一個錯誤:未定義的方法`空?' for#<PG :: Result:0x007fcc82900a78>

def self.get_table_id(id) 
    sql = "SELECT id FROM configtables WHERE parent = 'check' AND parentid = " + id.to_s 
    results = connection.execute(sql) 
    return nil if results.empty? # here's where the error happens 
    return results[0][0] 
    end 

我對Ruby和ActiveRecords以及PostgreSQL的知識知之甚少。數據庫中的值是results a postgres-object或什麼#<PG::Result:0x007fcc82900a78>以及它與sqlite3數據庫是什麼?

該函數是少數幾個使用原始sql字符串的函數之一。

+0

嘗試'結果= connection.execute(SQL).to_a' – Aleksey

+0

或者使用'select_all',而不是'execute'這導致一個'ActiveRecord :: Result'。然後你可以調用[這些方法](http://api.rubyonrails.org/classes/ActiveRecord/Result.html) – radubogdan

+0

@radubogdan謝謝,這也適用! – RagnarLothbrok

回答

2

empty?沒有爲PG::Result定義:

PG::Result.instance_methods.include?(:empty?) 
#=> false 

要使用empty?你應該將結果轉換爲陣列的一個實例:

results.to_a.empty? 
+0

謝謝,這工作。通過'sqlite'數據庫,我得到一個'hash',並帶有'postgreSQL'這個'PG :: Result'對象。這僅僅是因爲它是一個原始的SQL查詢或爲什麼這是不同的? – RagnarLothbrok

+0

@llqadude當然對於純ActiveRecord查詢,您將一直獲得特定模型的實例。然而,數據庫的實際工作分別由gems'pg'和'sqlite3'完成。對於一個簡單的查詢(就像你在OP中),sqlite3將運行[this](https://github.com/sparklemotion/sqlite3-ruby/blob/v1.3.13/lib/sqlite3/database.rb#L152)方法(這將給你一個數組),pg將運行[this](https://github.com/ged/ruby-pg/blob/master/ext/pg_connection.c#L3196)(它會給你'PG ::結果') – Aleksey

+0

shooot,我昨天錯過了評論:\感謝@Aleksey回答它! –

2

好像你應該從PG::Result「取」實際結果目的。這樣做的
一種方法可以調用to_a

嘗試以下操作:

sql = "SELECT id FROM configtables WHERE parent = 'check' AND parentid = " + id.to_s 
results = ActiveRecord::Base.connection.execute(sql).to_a 
... 
+0

謝謝。我在Andrey Deineko的回答中發佈了一個後續問題。 – RagnarLothbrok

相關問題