You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 3.2:相似数据库定义功能相同模型时指向新库的问题咨询

解决多数据库迁移中旧库模型关联指向新库的问题

我帮你梳理下问题根源和解决办法:

你的核心问题在于:虽然FromClip继承了指定旧库连接的抽象类FromDB,但它的多态关联belongs_to :clippable默认会指向应用主数据库(新库)的模型,而不是旧库对应的模型,所以才会出现“旧库模型表现得像新库模型”的情况。

下面是具体的修复步骤:

1. 为旧库的所有关联模型创建对应类

因为多态关联的目标模型(比如你的clippable可能对应Post、Video等)也需要连接旧库,所以要给每个关联模型创建继承自FromDB的版本:

# from_post.rb
class FromPost < FromDB
  self.table_name = "posts"
  has_many :clips, as: :clippable, class_name: "FromClip"
end

# from_video.rb
class FromVideo < FromDB
  self.table_name = "videos"
  has_many :clips, as: :clippable, class_name: "FromClip"
end

2. 修改FromClip的关联配置,显式指向旧库模型

需要在belongs_to关联里明确指定关联模型的类名,或者做类型映射(根据旧库clippable_type字段存储的内容来定):

情况一:旧库clippable_type存储的是原始类名(比如"Post")

用lambda动态生成旧库模型类名:

class FromClip < FromDB
  self.table_name = "clips"
  belongs_to :clippable, polymorphic: true, 
             class_name: ->(clip) { "From#{clip.clippable_type}" },
             counter_cache: true # 补全你原来的counter_cache配置
end

情况二:旧库clippable_type已经是新库的类名

直接做类型映射,把新库类名关联到旧库模型:

class FromClip < FromDB
  self.table_name = "clips"
  belongs_to :clippable, polymorphic: true,
             polymorphic: {
               Post => FromPost,
               Video => FromVideo
             },
             counter_cache: true
end

3. 确认数据库连接配置正确

检查database.yml里的FROM_DB配置是否准确指向旧数据库:

# database.yml示例
development:
  # 新数据库配置
  adapter: postgresql
  database: new_db
  # ...其他配置

from_db:
  adapter: postgresql
  database: old_db
  username: your_username
  password: your_password
  host: your_db_host

另外,你之前设置self.abstract_class = true的操作是正确的,这个确保FromDB不会被当作具体的数据表模型,而是作为连接旧库的基类。

内容的提问来源于stack exchange,提问作者Joshua Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:10:48