2013-05-29 31 views
0

我正在尝试使用32位有符号整数的比较器/验证器创建动态列。这显然会节省存储空间和其他优点。目前,该工程巨大的,如果我有一个UTF8Type验证(使用Twitter的为Ruby卡桑德拉客户端):Cassadra并从Ruby客户端创建一个int列名称

db.insert(:foo, 'mykey', {'mycol' => 'myval'}) 

这是哪里出现问题:

db.insert(:foo, 'mykey', {5 => 'myval'}) 

我认为这更多的是Ruby的问题比Cassandra的问题。使用Rails控制台,我得到以下抛出我:

TypeError: no implicit conversion of Fixnum into String 

进一步澄清,我不能简单地做:

db.insert(:foo, 'mykey', {'5' => 'myval'}) 

这将触发一个验证失败,这是期待着人们的整数列而不是字符串。

有没有办法让这个在Ruby中合理工作,这样我就不必使用UTF8Type列名,并能坚持诠释了我的卡珊德拉1.2基于应用程序基础的吗?

回答

1

Twitter Cassandra库将它留给开发者来序列化/反序列化所有值。它需要你给它的所有东西都是二进制字符串表示形式。所以,如果你想使用整数作为比较,你需要插入之前先收拾他们,并取出来卡桑德拉的时候解包。你插入需要看起来像这样:

db.insert(:foo, 'mykey', {[5].pack('N*') => 'myval'}) 
1

@MrYoshiji

Fixnum对象CAN声明为Ruby的哈希键。

只需使用正确的语法。你在Ruby中,而不是Python!

irb(main):010:0> { 1 => 'bonjour', 2 => "okay" } 
=> {1=>"bonjour", 2=>"okay"} 
irb(main):012:0> { 1 => 'bonjour', 2 => "okay" }.keys.map(&:class) 
=> [Fixnum, Fixnum]