2016-07-08 7 views
2

は、私は次のエラーメッセージを取得しておいてください。ルビー/ SQL構文未定義のメソッド `クエリ 'nilのために:NilClass(NoMethodError)

.RB:215:block in collectData': undefined methodクエリで':NilClass(NoMethodError)

nilのために

この は私のコードです:例えば、

databases = { 
    'aaa': Mysql2::Client.new(
     host:  '', 
     username: '', 
     password: '', 
     database: '' 
    ), 
    'bbb': Mysql2::Client.new(
     host:  '', 
     username: '', 
     password: '', 
     database: '' 
    ) 
} 

client1.query(" bla bla bla").each do |row| 
    if row['mmm'] == 99 
    # Look in next db 
    next_db = databases[row['db']] 
    row2 = next_db.query("SELECT...") 

は私が私の最初のSQLクエリ、client1.queryからデシベルの名前を取るrow['db'] = "aaa"または"bbb"。このようなテストな何かのために

も動作していない:私は私の方法は「未定義」である理由を理解することができないよう

client1 = Mysql2::Client.new(
    host:  '', 
    username: '', 
    password: '', 
    database: '' 
) 

client2 = Mysql2::Client.new(
    host:  '', 
    username: '', 
    password: '', 
    database: '' 
) 

client1.query(" bla bla bla").each do |row| 
    if row['mmm'] == 99 
    # Look in next db 
    next_db = client2 
    row2 = next_db.query("SELECT ") 

client1.query(" bla bla bla").each do |row| 
    if row['mmm'] == 99 
    # Look in next db 
    next_db = databases['aaa'] 
    row2 = next_db.query("SELECT...") 

そして、この作品のようなものを。

助けてください、

ありがとう!

答えて

0

がするデータベースのハッシュを変更しよう:

databases = { 
 
    'aaa' => Mysql2::Client.new(host: '', username: '', password: '', database: ''), 
 
    'bbb' => Mysql2::Client.new(host: '',username: '', password: '', database: '') 
 
}

+0

その作品!なぜ '=>'で、 ':'ではなく、なぜ誰かが説明できるのでしょうか? –

+1

@ br3ntの説明をご覧ください。 – Berlin

0

クライアントインスタンスは、実際の例のように、ハッシュ内のclientという変数には存在しません。エラーの理由は、nil値を持つ変数でqueryメソッドを呼び出そうとしているためです。

あなたが適切にあなたの顧客にアクセスする必要があります。もちろん、

databases['aaa'].query(" 
    ").each do |row| 
      if row['mmm'] == 99 
       # Look in next db 
       next_db = client 
       row2 = next_db.query(" 
       SELECT ") 

をあなたが目指しているのロジックを実現するために、あなたが手順を行うと、データベースをハッシュ歩くことが必要であろう。

+0

おかげで、私はその私の名前でDBにアクセスする必要があります私の最初のSQLクエリから取得し、行['db']はaaaまたはbbbです。 –

+0

私は最初のクエリから得た名前でaaaとbbbにアクセスしたいと思います。 –

+0

次に、 'databases'に含まれているクライアントの適切なクライアントを使って、各ステップで再帰関数を書きます。この側面は、回答を受けた元の質問とは関係ありません。 –

2

ですから、データベースのあなたのハッシュを持っている、とあなたが最初のデータベースクエリからの結果オフに基づいて次のデータベースを照会したい...

あなたがnilをチェックすることはありません除いて基本的にあなたが持っているコードが正しいです。この場合、row['db']によって戻されているものがあれば、一致するデータベースはdatabasesハッシュに見つかりません。私はこれが修正される必要がある例外であると仮定しようと思います。

そう...

# hash of databases 
databases = { 
    'aaa' => Mysql2::Client.new(host: '', username: '', password: '', database: ''), 
    'bbb' => Mysql2::Client.new(host: '',username: '', password: '', database: '') 
} 

# get the first database 
client1 = databases['aaa'] 

# perform the query 
client1.query("bla bla bla").each do |row| 
    if row['mmm'] == 99 
    # look in next db 
    client2 = databases[row['db']] 

    if (client2) 
     row2 = client2.query("SELECT...") 
    else 
     raise "Database `#{row['db']}` is not defined." 
    end 
    end 
end 
+0

私はまだ同じエラー "データベース' aaa'が定義されていません "、私は上記の答えでそれを修正、ありがとう。 –

+0

@AlexBrickmanは、ハッシュに間違った構文を使用していました...固定されました – br3nt

+3

コロンはキーをシンボルに変換していましたので、データベース[行['db']] 'は見つけようとしていました文字列ではなくシンボルであるdb。 – br3nt

関連する問題