2013-02-25 2 views
0

레일 응용 프로그램에서 클릭 할 때 한 데이터베이스의 데이터를 복사하여 다른 데이터베이스에 삽입하는 버튼이 있습니다.AR을 사용하여 만들 때 레일이 null 값을 전달합니다.

내 응용 프로그램을 2 개의 데이터베이스에 연결하기 위해 문어 보석을 사용하고 있습니다.

나는 아래의 코드를 사용하고, db_B에 db_A에서 기록을 복사하려면 null 값을 허용하지 않습니다,

Octopus.using(:shard_B) do 
    @book_new_live = Book.create(
     :BK_SUB_FK => @book.BK_SUB_FK, 
     :BK_TITLE => @book.BK_TITLE, 
     :BK_SOURCE => "", 
     :BK_PUB => "", 
     :BK_COVER => "", 
     :BK_LABEL_PRODUCT => @book.BK_LABEL_PRODUCT, 
     :BK_FINAL_LABEL => "", 
     :BK_VISUAL_METHOD => @book.PRB_VISUAL_METHOD, 
     :BK_DB => "", 
     :BK_COVERED_REGION => "", 
     :BK_VERSION_NO => @book.BK_VERSION_NO, 
     :BK_SEQ_FILE => "", 
    )do |primary| 
     primary.BK_ID = @book.BK_ID 
    end 
end 

데이터베이스 'db_b', 데이터 복사하기와 열이 null 일 수 없습니다 및 기본값은 'NONE'입니다.

또한 null 값을 허용 할 수 있도록 데이터베이스의 구조를 수정할 수 없습니다.

아래의 간단한 코드를 사용하면 열 'BK_SOURCE', 'BK_PUB', 'BK_COVER'...이 (가) null 일 수 없다는 오류 메시지가 나타납니다. 기본적으로 레일스는 해당 열에 null을 전달합니다.

그래서 null이 될 수없는 열에 빈 문자열을 전달해야합니다.

Octopus.using(:shard_B) do 
    @book_new_live = Book.create(
     :BK_SUB_FK => @book.BK_SUB_FK, 
     :BK_TITLE => @book.BK_TITLE, 
     :BK_LABEL_PRODUCT => @book.BK_LABEL_PRODUCT, 
     :BK_VISUAL_METHOD => @book.PRB_VISUAL_METHOD, 
     :BK_VERSION_NO => @book.BK_VERSION_NO, 
    )do |primary| 
     primary.BK_ID = @book.BK_ID 
    end 
end 

레일이 위의 코드에서 언급되지 않은 열에 null 값을 전달하는 것을 방지하는 방법이 있습니까?

답변

1

내가 제대로 이해하면, 당신은 단지 다음과 같이 당신의 가치를 보낼 or 연산자를 사용할 수 있습니다 : 속성이 후, nil 경우

Octopus.using(:shard_B) do 
    @book_new_live = Book.create(
    :BK_SUB_FK => @book.BK_SUB_FK, 
    :BK_TITLE => @book.BK_TITLE, 
    :BK_SOURCE => @book.BK_SOURCE || "NONE", 
    :BK_PUB => @book.BK_PUB || "NONE", 
    :BK_COVER => @book.BK_COVER || "NONE", 
    :BK_LABEL_PRODUCT => @book.BK_LABEL_PRODUCT, 
    :BK_FINAL_LABEL => "", 
    :BK_VISUAL_METHOD => @book.PRB_VISUAL_METHOD, 
    :BK_DB => "", 
    :BK_COVERED_REGION => "", 
    :BK_VERSION_NO => @book.BK_VERSION_NO, 
    :BK_SEQ_FILE => "", 
    )do |primary| 
    primary.BK_ID = @book.BK_ID 
    end 
end 

를 값이 전달 될 것을 말함으로써이 @book.BK_SOURCE || "NONE"입니다 대신 문자열 NONE이 전달됩니다.

hash = { 
    :BK_SUB_FK => @book.BK_SUB_FK, 
    :BK_TITLE => @book.BK_TITLE, 
    :BK_SOURCE => @book.BK_SOURCE, 
    :BK_PUB => @book.BK_PUB, 
    :BK_COVER => @book.BK_COVER, 
    :BK_LABEL_PRODUCT => @book.BK_LABEL_PRODUCT, 
    :BK_FINAL_LABEL => @book.BK_FINAL_LABEL, 
    :BK_VISUAL_METHOD => @book.PRB_VISUAL_METHOD, 
    :BK_DB => @book.BK_DB, 
    :BK_VERSION_NO => @book.BK_VERSION_NO 
} 
hash = hash.delete_if { |k, v| v.nil? } 
Octopus.using(:shard_B) do 
    @book_new_live = Book.create(hash)do |primary| 
    primary.BK_ID = @book.BK_ID 
    end 
end 

EDIT 그것을 시도주십시오.

+0

제안 해 주셔서 감사합니다. 코드를 간단하게 유지하고 BK_DB와 같은 데이터가없는 열은 포함하지 않으려합니다. 레일 앱을 null 대신 기본값으로 '없음'을 전달하도록 설정하는 방법이 있습니까? – Kim

+0

그럼. 'create' 메쏘드는 전달 될'hash'를 받아들입니다. 그래서 당신이 해시에'delete_if'를 적용하면 조건을 "모든 nil 값을 제거하십시오"가되게 만들면 작동 할 것이라고 믿습니다. 몇 가지 샘플 코드로 답을 수정하겠습니다. – MurifoX

관련 문제