在我的rails应用程序中,我有一个按钮,当单击它时,从一个数据库复制数据并将其插入另一个数据库。
我正在使用章鱼宝石将我的应用程序链接到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将空值传递给上面代码中未提及的列?
答案 0 :(得分: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
试一试。