2011-03-06 2 views
2

다음과 같이하고 싶습니다.모델의 속성을 해시로 저장할 수 있습니까?

내 모델에 저장소의 해시, 즉 이름/값 쌍이있는 열을 갖기를 원합니다. 모델에 레코드를로드 할 때 레코드에 액세스 할 때까지 (즉, 지연 초기화) 데이터베이스에서 값의 디 - 셀러 레이션을 수행하지 않습니다.

이것은 db의 내 행 중 몇 퍼센트 만 해시에 대한 값을 가지며 거의 액세스되지 않습니다.

이것이 가능합니까?

사용 예 :

user.properties["age"] = 12 

user.properties["height"] = xxx 

user.save 

나는 그것이 어쩌면 JSON 형식에서 DB에 저장 될 방법을 잘 모르겠어요?

+0

를 볼 만하다 Hash_function)은 –

답변

5

예, 데이터를 직렬화 할 수 있습니다. http://api.rubyonrails.org/classes/ActiveRecord/Base.html에서

발췌 :

class User < ActiveRecord::Base 
    serialize :preferences 
end 

user = User.create(:preferences => { "background" => "black", "display" => large }) 
User.find(user.id).preferences # => { "background" => "black", "display" => large } 
+0

을 의미합니다. 감사합니다. 답변을 업데이트했습니다. – vise

+0

하지만 개체를 ​​올바르게로드 할 때마다이 속성의 직렬화가 해제됩니까? 나는 게으른 직렬화를 원한다. 즉, 액세스 된 경우에만 – Blankman

1

ActiveRecord::Base#serialize는이 작업을 수행합니다.

class User < ActiveRecord::Base 
    serialize :preferences, Hash 
end 

user = User.create(:preferences => { "background" => "black", "display" => large }) 
User.find(user.id).preferences # => { "background" => "black", "display" => large } 
User.find(user.id).preferences[:background] # => "black" 
+1

내가 잘못된 발췌 부분을 붙여 넣었으므로 고쳐졌지만, 주석에 언급 했어야했다. 링크 만 게시 한 다음 좋은 발췌문을 사용하여 게시물을 편집하고 답변에서 내 실수를 강조하면 불공평 한 프로세스를 저장하지 않은 최근 편집 내용을 찾을 수 없습니다. – vise

+0

좋은 지적입니다. 거의 정확한 대답에 대해 논평하는 것이 더 재치 있었을 것입니다. 죄송합니다. 변명의 여지가 없지만 StackOverflow 및 밧줄 학습에 익숙합니다. 나는 단지 동료 루비스트를 돕고 싶다. – Unixmonkey

0

문자열을 데이터 형식으로 사용하여 해시를 yaml 형식으로 저장할 수 있습니다. 이 yaml 문자열을로드해야하지만 IMHO는 더 많은 이식성을 제공합니다.

hash = {a => b, c=>d} 
object.properties = hash.to_yaml 
. 
. 
. 
hash = Yaml::load(object.properties) 
관련 문제