Skip to content

Instantly share code, notes, and snippets.

@svs
Created January 31, 2014 12:20
Show Gist options
  • Save svs/8731067 to your computer and use it in GitHub Desktop.
Save svs/8731067 to your computer and use it in GitHub Desktop.
# Given a table stat with primary key "slug" with data
# [{slug: 'foo', stats: {}}, {slug:'bar', stats:{}}]
updated_stats = {
'foo' => {a: 1, b: 2},
'bar' => {a: 3, b: 4}
}
# I can do this
updated_stats.each{|k,v|
r.table('stats').get(k).update{|s|
{ :stats => updated_stats[k] }
}
}
# so, why can't I do the following?
r.table('stats').get_all(*updated_stats.keys).update{|s|
{ :stats => updated_stats[s["slug"]] }
}
# the rql shows nil as the value of updated_stats[s["slug"]]
# any idea? thanks!
@neumino
Copy link

neumino commented Jan 31, 2014

It's a tricky problem.

Here's the solution first.

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

Then updated_stats is a ruby hash so when you use the brackets, it's the usual bracket operator, and since updated_stats doesn't have the key s["slug"], it returns nil.
So you have to wrap updated_stats in r.expr().

Then brackets in ruby are used for nth, get_field, slice etc. And when given a variable, it cannot guess which one it should use.
So you have to explicitly say you want to use get_field.
We will add a bracket term, which should fix this problem -- see rethinkdb/rethinkdb#1179

Sorry you ran into this!

@svs
Copy link
Author

svs commented Feb 6, 2014

@neumino Thanks so much!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment