2010-04-11 4 views
15

레이크 마이그레이션 파일 내에서 사용할 사용자 지정 데이터 형식을 어떻게 만들 수 있는지 궁금합니다. 예 : 모델을 만드는 경우 마이그레이션 파일 내에 열을 추가 할 수 있습니다. 그것은 다음과 같이 수 :레일 : 사용자 지정 데이터 형식 만들기/속기 만들기

def self.up 
    create_table :products do |t| 
     t.column :name, :string 
     t.timestamps 
    end 
    end 
나는 이런 식으로 뭔가를 만드는 방법을 알고 싶습니다

:

t.column :name, :my_custom_data_type 

에 불과하다 예를 들어 "통화"유형을 만드는 이유, 8의 정밀도와 2의 소수점을 갖는 10 진수보다 더 큽니다. MySQL 만 사용하기 때문에이 데이터베이스에 대한 솔루션으로 충분합니다.

의견 및 의견을 보내 주셔서 감사합니다.

+0

통화에 부동 소수점 데이터 형식을 사용하는 것은 일반적으로 끔찍한 생각입니다. –

+0

당신이 더 나은 해결책을 가지고 있다면, 정교하게하십시오. – Shyam

+1

money gem과 같은 것을 사용하십시오. http://money.rubyforge.org/. – theIV

답변

21

사용자가 원하는 것은 사용자 지정 형식을 만드는 옵션을 제공하는 새로운 열 만들기 메서드를 정의하는 것입니다. 기본적으로 마이그레이션시 t.integer ...처럼 작동하는 메소드를 추가하여 수행됩니다. 트릭은 코드를 추가 할 위치를 파악하는 것입니다. 당신의 초기화 디렉토리 곳이 코드 조각에

일부 :

module ActiveRecord::ConnectionAdapters 
    class TableDefinition 
    def currency (*args) 
     options = args.extract_options! 
     column_names = args 
     options[:precision] ||= 8 
     options[:scale] ||= 2 
     column_names.each { |name| column(name, 'decimal', options) } 
    end                  
    end 
end 

는 이제 통화 방법을 사용할 수는 통화 열에게 당신이 그것을 필요로하는 어떤 시간을 정의 할 수.

예 :

def self.up 
    create_table :products do |t| 
    t.currency :cost 
    t.timestamps 
    end 
end 

기존 테이블에 통화 열을 추가하려면 :

def self.up 
    change_table :products do |t| 
    t.currency :sell_price 
    end 
end 

경고 : 나는 그것을 테스트 할 시간이 없다, 그래서 보장은 없습니다. 작동하지 않으면 최소한 올바른 방향으로 이동해야합니다.

+0

나는 이것을 바로 시험 할 것이다. 노력과 도움에 감사드립니다! – Shyam

+0

고마워, 방금 그걸 사용 했어. 한가지주의 할 점은't'는'create_table'의'TableDefinition'이지만'change_table'의'Table'입니다. 내 맞춤 생성 코드를 모듈에 넣고 두 클래스에 모두 포함 시켰습니다. – Kolja

+0

안녕하세요 @emfi 이것은 정말 좋습니다 .. 모델 통화가있는 것처럼 더 가져갈 수있는 방법이 있습니까? 예를 들어 내가 원하기 때문에 그냥 생각. 동일한 장소에서 통화 입력 유효성 검사를 위해 .. 나는 또한 그것을 찾을 것입니다. 감사합니다. – sethi

관련 문제