2013-02-25 71 views
0

在我的導軌應用程序中,我有一個按鈕,單擊它時,從一個數據庫複製數據並將其插入另一個數據庫。當使用AR創建方法時,導軌通過空值創建方法

我正在使用章魚寶石將我的應用程序鏈接到2個數據庫。

從db_A複製記錄db_B,我使用下面的代碼:

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」,到數據複製,不接受空值與列不能爲空,默認值是'NONE'。

此外,我不允許修改數據庫的結構,以便它可以接受空值。

如果我使用下面的簡化代碼,則會收到一條錯誤消息,通知我列'BK_SOURCE','BK_PUB','BK_COVER'...不能爲空。默認情況下,rails將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 

有沒有一種方法可以防止rails將空值傳遞給上面代碼中沒有提到的列?

回答

1

如果我理解正確的話,你可以只使用or運營商發送你的價值觀是這樣的:

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",如果屬性爲nil,則而是傳遞字符串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 

試試看吧。

+0

感謝您的建議。我想保持我的代碼簡單,並且不包含我沒有數據例如'BK_DB'的列。有沒有一種方式設置導軌應用程序傳遞'無'作爲默認而不是空? – Kim 2013-02-25 17:50:50

+0

那好吧。 'create'方法接受一個'hash'來傳遞。所以如果你在你的散列上應用'delete_if',使條件成爲「刪除所有nil值」,那麼我相信它會起作用。我將用一些示例代碼編輯答案。 – MurifoX 2013-02-25 18:50:58