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 的查询启动应用程序时,它会检查表结构,并根据它使用 submit_fk 构造您的 Image 类。

当您更改分片时,它不会再次检查表结构,因此它假设有一个sub_fk,并且假设没有sub_fk,因为它不知道这一点。

我建议您对所有分片使用相同的结构,但如果您不能这样做,您可能会强制 ActiveRecord重新加载表信息- 我从未使用过 Octopus,但我认为它会起作用:

Image.reset_column_information

请注意,它会降低应用程序的性能,因为重新加载元数据是一个缓慢的操作。

于 2013-01-17T11:15:18.627 回答