2017-02-10 3 views
4

Oracle 데이터베이스가 있습니다. 데이터베이스에는 부울이 없습니다. 그러나 레일스로 이주한 후 1 문자가있는 VARCHARS는 부울이되었습니다. 어떻게 다시 varchar로 바꿀 수 있습니까? Btw 내 데이터베이스는 오라클 10g이고 나는 루비와 레일의 최신 버전을 사용하고있다. 레일에서의 마이그레이션은 varchar를 1 문자로 부울로 바꿉니다.

Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
INTM_NO         NOT NULL NUMBER(12) 
INTM_NAME         NOT NULL VARCHAR2(240) 
CO_INTM_TYPE        NOT NULL VARCHAR2(5) 
INTM_TYPE         NOT NULL VARCHAR2(2) 
TIN          NOT NULL VARCHAR2(20) 
CORP_TAG         NOT NULL VARCHAR2(1) 
SPECIAL_RATE        NOT NULL VARCHAR2(1) 
LIC_TAG         NOT NULL VARCHAR2(1) 
MAIL_ADDR1        NOT NULL VARCHAR2(50) 
MAIL_ADDR2           VARCHAR2(50) 
MAIL_ADDR3           VARCHAR2(50) 
BILL_ADDR1        NOT NULL VARCHAR2(50) 
BILL_ADDR2           VARCHAR2(50) 
BILL_ADDR3           VARCHAR2(50) 
ISS_CD            VARCHAR2(2) 
PHONE_NO           VARCHAR2(40) 
BIRTHDATE           DATE 
CONTACT_PERS          VARCHAR2(50) 
DESIGNATION          VARCHAR2(5) 
PARENT_INTM_NO          NUMBER(12) 
CA_NO            VARCHAR2(15) 
LF_TAG            VARCHAR2(1) 
CO_INTM_NO           NUMBER(12) 
REF_INTM_CD          VARCHAR2(10) 
PAYT_TERMS           VARCHAR2(3) 
EFF_DATE           DATE 
EXPIRY_DATE          DATE 
USER_ID         NOT NULL VARCHAR2(8) 
LAST_UPDATE        NOT NULL DATE 
REMARKS           VARCHAR2(4000) 
CPI_REC_NO           NUMBER(12) 
CPI_BRANCH_CD          VARCHAR2(2) 
WTAX_RATE           NUMBER(5,3) 
ACTIVE_TAG        NOT NULL VARCHAR2(1) 
WHTAX_ID           NUMBER(5) 
INPUT_VAT_RATE          NUMBER(5,3) 
PRNT_INTM_TIN_SW       NOT NULL VARCHAR2(1) 
OLD_INTM_NO          NUMBER(12) 
CA_DATE           DATE 
NICKNAME           VARCHAR2(40) 
CP_NO            VARCHAR2(40) 
EMAIL_ADD           VARCHAR2(50) 
FAX_NO            VARCHAR2(40) 
HOME_ADD           VARCHAR2(150) 
MASTER_INTM_NO          NUMBER(12) 
SUN_NO            VARCHAR2(40) 
SMART_NO           VARCHAR2(40) 
GLOBE_NO           VARCHAR2(40) 
PIN_CODE           VARCHAR2(6) 

은 스키마의 테이블

create_table "giis_intermediary", comment: "Intermediary (agent) information", primary_key: "intm_no", force: :cascade do |t| 
    t.string "intm_name",  limit: 240,       null: false 
    t.string "co_intm_type",  limit: 5,        null: false 
    t.string "intm_type",  limit: 2,        null: false 
    t.string "tin",    limit: 20,       null: false 
    t.boolean "corp_tag",            null: false 
    t.boolean "special_rate",           null: false 
    t.boolean "lic_tag",            null: false 
    t.string "mail_addr1",  limit: 50,       null: false 
    t.string "mail_addr2",  limit: 50,           
    t.string "mail_addr3",  limit: 50,           
    t.string "bill_addr1",  limit: 50,       null: false 
    t.string "bill_addr2",  limit: 50,           
    t.string "bill_addr3",  limit: 50,           
    t.string "iss_cd",   limit: 2,           
    t.string "phone_no",   limit: 40,           
    t.date "birthdate",               
    t.string "contact_pers",  limit: 50,           
    t.string "designation",  limit: 5 
    t.integer "parent_intm_no", limit: 12, precision: 12,      
    t.string "ca_no",   limit: 15 
    t.boolean "lf_tag" 
    t.integer "co_intm_no",  limit: 12, precision: 12 
    t.string "ref_intm_cd",  limit: 10 
    t.string "payt_terms",  limit: 3 
    t.date "eff_date" 
    t.date "expiry_date" 
    t.string "user_id",   limit: 8,        null: false 
    t.date "last_update",           null: false 
    t.string "remarks",   limit: 4000 
    t.integer "cpi_rec_no",  limit: 12, precision: 12 
    t.string "cpi_branch_cd", limit: 2 
    t.decimal "wtax_rate",      precision: 5, scale: 3 
    t.boolean "active_tag",            null: false 
    t.integer "whtax_id",   limit: 5, precision: 5 
    t.decimal "input_vat_rate",    precision: 5, scale: 3 
    t.boolean "prnt_intm_tin_sw",          null: false 
    t.integer "old_intm_no",  limit: 12, precision: 12 
    t.date "ca_date" 
    t.string "nickname",   limit: 40 
    t.string "cp_no",   limit: 40 
    t.string "email_add",  limit: 50 
    t.string "fax_no",   limit: 40 
    t.string "home_add",   limit: 150 
    t.integer "master_intm_no", limit: 12, precision: 12 
    t.string "sun_no",   limit: 40 
    t.string "smart_no",   limit: 40 
    t.string "globe_no",   limit: 40 
    t.string "pin_code",   limit: 6 
    end 

업데이트 : 나는 GitHub의에서 오라클 강화 된 어댑터 보석을 보았고, 이러한

# if emulate_booleans_from_strings then store booleans in VARCHAR2 
     NATIVE_DATABASE_TYPES_BOOLEAN_STRINGS = NATIVE_DATABASE_TYPES.dup.merge(
     boolean: { name: "VARCHAR2", limit: 1 } 
    ) 

오라클 강화 된 어댑터에 기본을 가지고 발견 1 문자 만있는 varchar를 부울로 변경합니다.

+0

어떤 테이블이 생겼 :

당신은 config/initializers/oracle.rb의 설정을 변경하여이 문제를 해결할 수 있습니까? 오라클에는 기본 부울 유형이 있습니까? 나는'tinyint (1)'컬럼을 사용할 때 레일스가 MySQL과 비슷한 일을 할 것이라고 생각한다. 아마도 MySQL 솔루션이 오라클에 적용될 수있을 것이다. –

+0

테이블에는 varchar, number, date 데이터 유형 만 있지만 부울은 없습니다. 죄송합니다. 문자열이 아니고 varchar가 아닙니다. –

+0

감사합니다. @muistooshort : D –

답변

1

발생하는 문제는 어댑터에 있습니다.

Oracle에는 기본 부울 데이터 유형이 없기 때문에 activerecord-oracle_enhanced-adapter은 기본적으로 특정 필드의 특정 값을 부울로 변환하려고 시도합니다. 예를 들어, _yn으로 끝나는 필드는 자동으로 부울로 변환됩니다. 또한 제한이 1 인 VARCHARS는 부울로 처리됩니다.

ActiveSupport.on_load(:active_record) do 
    ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do 
    self.emulate_booleans_from_strings = false 
    end 
end 
+0

고맙습니다. 작동합니다. D –