2014-06-18 3 views
0

플로피 값이있는 해시를 저장하기 위해 내 모델 중 하나에 hstore을 사용하고 있습니다. 정기적으로 액세스하여 상점의 값을 계산해야합니다.Rails + Postgres - hstore 문자열 자동 변환

이 값으로 작업하기위한 현재의 솔루션은 내가 액세스 할 수있는 모든 곳을 부동 상태로 변환하는 것이며, 이는 매우 불안정합니다. 저장소에서 읽은 값을 자동으로 변환하도록 store_accessor 메서드를 수정하는 방법이 있습니까?

as described in the docs 함수를 작성하여 특정 키에이 작업을 수행 할 수 있음을 알고 있지만 가능한 키 목록이 매우 길어서 이런 식으로 매우 건조하지는 않습니다.

+0

유용 할 수도 있습니다. https://github.com/jalkoby/active_store_accessor – Vakiliy

+0

감사합니다. Vakiliy - 귀하의 보석이 훌륭하게 작동합니다.이 응용 프로그램에 필요한 것보다 조금 더 큽니다. – l85m

답변

1

나는 이전에 hstore을 사용했지만 사용자가 질문에서 제공 한 문서를 연구했습니다. 글쎄, hstore은 정말 유용합니다 (너무 좋지는 않지만 postgreSQL DB에서만 사용 가능하지만 새로운 것을 배웠습니다). 설명서를 읽기에서

,

주 - hstore 또는 JSON 같은 PostgreSQL을에게 특정 열을 사용하는 경우 상점에서 제공하는 직렬화 필요가 없습니다. 단순히 대신 액세스 메소드를 생성하기 위해 store_accessor를 사용하십시오. 이러한 열은 문자열 키순 해시를 사용하며 기호를 사용하여 액세스를 허용하지 않습니다. 또한

는 :

저장된 속성 이름 stored_attributes를 사용하여 검색 될 수있다.

User.stored_attributes[:settings] # [:color, :homepage]

그래서, 우리는 stored_attribute 사용 stored_attributes 해시에 별도의 필드를 받고있을 것이며, 우리가 배열로 stored_attribute에 선언 된 필드를 받고있을 것입니다. 이제 배열의 모든 요소에 대한 접근자를 재정의해야합니다. define_method을 사용하여 접근자를 동적으로 재정의 할 수 있습니다. 이것이 내가 생각해내는 것입니다.

class WorkingBill < ActiveRecord::Base 
    store_accessor :prices, :cost_price, :selling_price 

    stored_attributes[:prices].each do |price_column_name| 
    define_method("#{key}=") do |value| 
     super(value.to_f) 
    end 

    define_method(key) do 
     super.to_f 
    end 
    end 
end 

저는 지금 개발 환경이 없으므로이 코드를 테스트하지 않았습니다. 또한 super 전화가 define_method 내부에서 작동하는지 의심 스럽습니다. 그래서, 그냥 시도해보십시오. 개발 환경을 얻은 후에도 테스트 해 보겠습니다.

또한 @Vakily 주석으로, 보석 https://github.com/jalkoby/active_store_accessor이 더 잘하는 것으로 보이며 부울, 정수 필드도 처리합니다.

+0

대단히 고마워요! – l85m