6

ハッシュで事前に計算された値に基づいて、RethinkDB で複数のドキュメントを更新しようとしています。すなわち

次のようなデータstatsを持つ主キーを持つテーブルが与えられた場合slug

[{slug: 'foo', stats: {}}, {slug:'bar', stats:{}}]

次のような値を持つハッシュが与えられます

updated_stats = {
  'foo' => {a: 1, b: 2}, 
  'bar' => {a: 3, b: 4}
}

私がすることができます

updated_stats.each{|k,v| 
  r.table('stats').get(k).update{|s| 
    { :stats => v } 
  }  
}

では、なぜ次のことができないのでしょうか。

r.table('stats').get_all(*updated_stats.keys).update{|s| 
  { :stats => updated_stats[s["slug"]] }  
}

rql は、updated_stats[s["slug"]] の値として nil を示します。これについて何か助けていただければ幸いです。ありがとう。

4

2 に答える 2

6

難しい問題です。

まず解決方法はこちら。

r.table('stats').get_all(*updated_stats.keys).update{|s| 
  { :stats => r.expr(updated_stats).get_field(s["slug"]) } 
}.run()

次にupdated_stats、ルビのハッシュなので、ブラケットを使用すると、通常のブラケット演算子になりupdated_stats、キー s["slug"] がないため、nil が返されます。したがって、ラップする必要がありupdated_statsますr.expr()

次に、ルビの括弧は、、などに使用されますnth。また、変数が与えられると、どれを使用すべきかを推測できませんget_fieldsliceしたがって、使用したいことを明示的に言わなければなりませんget_field。この問題を修正するブラケット用語を追加します -- https://github.com/rethinkdb/rethinkdb/issues/1179を参照してください

申し訳ありませんが、これに遭遇しました!

于 2014-01-31T20:09:21.267 に答える