2017-04-20 69 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

相关问题