0

私のレールアプリケーションには、クリックするとあるデータベースからデータをコピーして別のデータベースに挿入するボタンがあります。

octopus 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' は NULL 値を受け入れず、列を 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 値を渡さないようにする方法はありますか?

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 に答える