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
相关产品推荐
相关产品推荐

