rails - 数据库分片

时间:2013-01-17 11:07:00

标签: ruby-on-rails octopus

我有以下代码将数据库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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

ActiveRecord在为表执行第一个查询时加载元数据(表信息)。当您通过查询shard_A启动应用程序时,它会检查表结构,并使用submission_fk根据它构造您的Image类。

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

我建议你对所有分片使用相同的结构,但是如果你不能这样做,你可以强迫ActiveRecord reload the table information - 我从未使用过Octopus,但我认为它会起作用:

Image.reset_column_information

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