rails使用AR create方法创建时传递空值

时间:2013-02-25 17:34:43

标签: ruby-on-rails octopus

在我的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将空值传递给上面代码中未提及的列?

1 个答案:

答案 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

试一试。