0

在我的 rails 应用程序中,我有一个按钮,单击该按钮时,会从一个数据库复制数据并将其插入另一个数据库。

我正在使用章鱼 gem 将我的应用程序链接到 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 传递给这些列。

所以我必须将空字符串传递给不能为空的列。

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将空值传递给上面代码中没有提到的列?

4

1 回答 1

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

试试看。

于 2013-02-25T17:44:18.320 回答