2016-10-06 3 views
0
[1] pry(main)> o.items 
=> [{"78"=>"{\"size\"=>\"96\", \"side\"=>[]}"}] 

[2] pry(main)> o.items[0] 
=> {"78"=>"{\"size\"=>\"96\", \"side\"=>[]}"} 

[3] pry(main)> o.items[0]['78'] 
=> "{\"size\"=>\"96\", \"side\"=>[]}" 

[4] pry(main)> o.items[0]['78']["side"] 
=> "side" 

행 4는 빈 배열을 반환하지 않습니까? 어떻게 돌아 오는 "편"이 되었습니까?값 대신 키를 반환하는 루비 해시 배열?

편집 나는이 해시 (이것은 PostgreSQL의에 hstore의 배열)의 배열을 저장 한 후 발생했습니다.

예 : 의도 한대로 해시를 반환합니다.

o.items << {78 => {"size" => 1, "side" => []}} 
o.items 
=> [{"78"=> {"size"=>"1", "side"=>[]}}] 

는하지만

o.save 
o.items 
=> [{"78"=>"{\"size\"=>\"96\", \"side\"=>[]}"}] 

을 저장 한 후 나는를 변경하기 전에 해시로 다시 문자열로 변환 ([ '78'] o.items [0]) 평가하고 결국 해시 및 업데이트하기. 이것은 매우 불필요한 것 같습니다. 더 좋은 옵션이 있습니까?

+4

자세히 살펴보십시오. 'o.items [0] [ '78']'는 해시가 아니라 문자열입니다. – Aetherus

+0

@Aetherus awesome, thanks – echan00

+0

@Aetherus 그 질문에 답하는 것처럼 보입니다. 아마 답이 나올 수 있도록 작성해야합니다. – thesecretmaster

답변

2

의견 제시자가 지적한대로 문제는 데이터 형식에 있습니다. 사실 문자열 일 때 값이 해시라고 생각했습니다. 이스케이프 된 큰 따옴표는 여기 단서입니다.

{"size"=>"96", "side"=>[]} 

"{\"size\"=>\"96\", \"side\"=>[]}" 

차이를 보이지?

문자열이 있고 문자열 # [] 메서드를 사용하여 액세스하면 문자열이 있으면 해당 문자열을 반환합니다. 문서는 말한다 :

If a match_str is given, that string is returned if it occurs in the string. 

확인 자세한 내용은이 링크 : http://ruby-doc.org/core-2.3.0/String.html#method-i-5B-5D

+0

내 질문에 어떻게되었는지에 대한 정보를 추가했습니다. 해시의 내부가 내 postgresql 데이터베이스에 저장 한 후 문자열로 변환 된 것처럼 보입니다. 문자열을 해시로 변환하여 업데이트 할 수있는 유일한 방법은 무엇입니까? – echan00

1

이 레일 속성에 저장되는 경우는 다음 적절하게 데이터의 종류를 처리해야합니다. 이 방법은 다음 방법 중 하나를 사용하는 것이 가장 좋습니다.

  • 임의 구조를 저장하기 위해 JSON 열 유형 사용.
  • 임의의 데이터를 처리하려면 serialize으로 플래그를 지정하십시오.

MySQL 5.7 및 Postgres 9.3 이상에서는 JSON을 열 유형으로 지원하므로 가능한 경우 그 방향으로 조정합니다. 옵션이 아닌 경우 일반 TEXT 열과 serialize 옵션을 사용하십시오.

그러면 ActiveRecord가 원래 형식으로 다시 구성하는 형식으로 구조가 저장됩니다. 문자열 화 된 해시를 처리 할 필요가 없습니다.

여기에 우연히 트립하는 것은 다양한 옵션을 사용할 수있는 String#[] 메서드이지만 그 중 하나는 일치시킬 부분 문자열입니다.

string = "ruby has strings" 

string["ruby"] 
# => "ruby" 

string["test"] 
# => nil 

[] 방법은 편의상의 문제로 모든 일에 사용이 특정 비록 : 루비 해시와 같은 문자열이 작동하는 것처럼, 당신이 찾고있는 문구가 포함 된 경우 사용법은 종종 간과됩니다.

경고 : 문자열에서 해시를 재구성 eval을 사용하여 정말 최후의 수단 옵션이며, 아무리 어색하거나 불편 그것이 어떤 다른 방법이 존재하지 않는 경우는 피해야한다. 임의의 문자열을 평가하는 것은 무엇이든 들어갈 수있는 것처럼 막대한 책임입니다. 으로 평가할 수 있습니다. 시스템을 손상시키는 것은 매우 쉽습니다.