2014-11-18 2 views
0

해시 테이블을 저장할 때 기록과 같이 특정 순서를 원합니다. 그러나 포스트그레스는 그것을 자신의 방식으로 분류합니다. 녹음 정렬을 어떻게 지정할 수 있습니까?Postgresql이 그를 저장 한 후 해시를 정렬합니다.

예 :

INSERT INTO "items" ("nested_params") VALUES ($1) [["nested_params", "\"Turbo\"=>\"Some variable\",\"TV\"=>\"Some variable\",\"FM\"=>\"Some variable\"]; 
SELECT "items".* FROM "items" WHERE "items"."id" = $2 LIMIT 1 ["id", 5]]; 

출력 (루비 해시)

{"FM"=>"Some variable", "TV"=>"Some variable", "Turbo"=>"Some variable"} 

Turbo 녹화 - 제 1 키.

P. 해시 키가 아닌 영어 키를 사용합니다. 하지만 숫자 문자로 정렬하지 않고 무작위로 정렬하지 않습니다.

+1

해시에'hstore'를 사용 하시겠습니까? –

+0

예, 있습니다. 그리고 러시아 문자 – CannyFoxx

+2

hstore (대부분의 키/값 물건과 마찬가지로)에는 고유 한 순서가 없습니다. 주문하려면 데이터베이스에서 꺼내서 직접 주문해야합니다. –

답변

1

hstore도 JSON도 본질적으로 정렬되지 않습니다. fine hstore manual에서 :

쌍의 순서는 중요하지 않으며 출력시 재생되지 않을 수 있습니다.

fine JSON specification에서

:

객체 이름/값 쌍들의 순서화 된 집합이다.

어느 누구도 주문을 염려하지 않을 것이며 데이터베이스는 자유롭게 재 배열 할 수 있습니다. JSON 버전이 순서를 유지한다고해서 다음 번에 또는 업그레이드 이후에 해당하므로 지정되지 않은 동작에 의존하지 않습니다.

해시에서 주문을 염려한다면 Ruby에서 직접해야합니다. 루비 버전이 Array#to_h이없는 경우

def nested_params 
    super.sort_by(&:first).to_h 
end 

당신은 말할 수 :

def nested_params 
    Hash[super.sort_by(&:first)] 
end 

당신이 사용할 수있는 hstore 또는이 작업을 수행하는 쉬운 방법은 표준 액티브 접근 방법을 무시하는 것입니다 json 이러한 재정의 된 열 유형. 대소 문자를 구분하지 않으려면 정렬을 적절히 조정해야합니다.