2013-05-29 2 views
0

32 비트 부호있는 정수 인 비교 자/유효성 검사기를 사용하여 동적 열을 만들려고합니다. 이것은 분명히 다른 장점들 중 저장 공간을 절약 할 것입니다.Cassadra 및 Ruby 클라이언트에서 int 열 이름 생성

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

이 문제가 발생합니다 :

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

나는 이것이 루비 문제가 더 생각 나는 (루비 트위터의 카산드라 클라이언트를 사용하여)를 UTF8Type 유효성 검사기가있는 경우 현재이 잘 작동 카산드라 문제보다. 레일 콘솔을 사용하여, 나는이 날 밖으로 던져 다음 얻을 :

TypeError: no implicit conversion of Fixnum into String 

또한 설명, 나는 간단하게 수행 할 수 없습니다이 유효성 검사를 트리거

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

가에 대한 정수를 기대하는 실패 열이 아니라 문자열.

내가 UTF8Type 열 이름을 사용하지 않아도 내 카산드라 1.2 기반 응용 프로그램 기반의 사람들을 int로 충실 할 수 있도록이 합리적으로 루비에서 작동 할 수있는 방법이 있나요?

답변

1

트위터 Cassandra 라이브러리는 모든 값을 직렬화/비 직렬화하는 개발자에게 맡깁니다. 바이너리 문자열 표현으로하기 위해 모든 것을 요구합니다. 따라서 int를 비교 자로 사용하려면 int를 Cassandra에서 가져올 때 패킹하기 전에 패킹해야합니다. 귀하의 삽입은 다음과 같이해야합니다 :

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

@MrYoshiji

Fixnum이라는 루비 해시에 열쇠로 선언 할 수 있습니다.

올바른 구문을 사용하십시오. Python이 아니라 Ruby에 있습니다!

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]