0

データベース A (shard_A) のイメージ テーブルからデータベース B (shard_B) の別のテーブルにデータをコピーする次のコードがあります。

両方のデータベースの画像テーブルの構造は次のとおりです

Image table (shard_A)   -   Image table (shard_B)
- image_id              -   image_id 
- submission_fk         -   sub_fk 
- image_desc            -   img_desc

2 つのテーブルの列名が若干異なります

  @test_shard_A = Image.using(:shard_A).find(:first, :conditions => ["submission_fk =?", @sub.id ])

  Octopus.using(:shard_B) do

    Image.create(
    :image_id => @test_shard_A.image_id,
    :sub_fk => @test_shard_A.submission_fk,
    :img_desc => @test_shard_A.image_desc
    ) do |primary|
    primary.img_id = @test_shard_A.image_id
    end

  end

上記は私に次のエラーメッセージを与えています:

unknown attribute: sub_fk

私は何を間違っていますか?

4

1 に答える 1

2

テーブルに対して最初のクエリが実行されると、ActiveRecord はメタデータ (テーブル情報) を読み込みます。shard_A へのクエリでアプリケーションを開始すると、テーブル構造がチェックされ、それに従って、submission_fk を使用して Image クラスが構築されます。

シャードを変更すると、テーブル構造が再度チェックされないため、sub_fk が存在しないと見なされます。sub_fk は認識されていないためです。

すべてのシャードに同じ構造を使用することをお勧めしますが、それができない場合は、ActiveRecord にテーブル情報を強制的に再読み込みさせることができます。私は Octopus を使用したことはありませんが、うまくいくと思います。

Image.reset_column_information

メタデータのリロードは処理が遅いため、アプリケーションのパフォーマンスが低下することに注意してください。

于 2013-01-17T11:15:18.627 に答える