Ruby on rails 生产环境中的模型关联更改,特别是将模型转换为多态?

Ruby on rails 生产环境中的模型关联更改,特别是将模型转换为多态?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我希望我能在已经投入生产的应用程序中获得关于模型工作方式重大变化的反馈 就我而言,我有一张模型唱片,上面有很多电话号码 目前,它是一个典型的有许多属于与一个有许多电话号码的记录的关联 当然,我现在有一个功能,可以添加临时的、用户生成的记录,这些记录也会有电话号码 我“可以”只是将用户\u记录\u id添加到电话号码模型中,但这不是一个多态关联更好吗 如果是这样的话,如果你改变了模型的关联方式,我怎么能在不破坏一切的情况下更新生产数据库呢?> 维护页面是您的答案 生成更新表结构和更新现有数据的迁移

我希望我能在已经投入生产的应用程序中获得关于模型工作方式重大变化的反馈

就我而言,我有一张模型唱片,上面有很多电话号码

目前,它是一个典型的有许多属于与一个有许多电话号码的记录的关联

当然,我现在有一个功能,可以添加临时的、用户生成的记录,这些记录也会有电话号码

我“可以”只是将用户\u记录\u id添加到电话号码模型中,但这不是一个多态关联更好吗


如果是这样的话,如果你改变了模型的关联方式,我怎么能在不破坏一切的情况下更新生产数据库呢?> 维护页面是您的答案

  • 生成更新表结构和更新现有数据的迁移。如果您反对迁移中的数据更新,请使用rake任务
  • 禁用web访问(创建维护页面)
  • 部署新代码
  • 运行挂起的迁移
  • 更新数据
  • 启用web访问(删除维护页面)

  • 有两种方法可能对您有所帮助

    一个是引入一个处理电话号码集合的中间模型。通过这种方式,您的记录和用户记录都可以属于此收集模型,并且可以从中关联电话号码和其他联系信息。你最终的关系是这样的:

    class Record < ActiveRecord::Base
      belongs_to :address_book
      delegate :phone_numbers, :to => :address_book
    end
    
    class UserRecord < ActiveRecord::Base
      belongs_to :address_book
      delegate :phone_numbers, :to => :address_book
    end
    
    class AddressBook < ActiveRecord::Base
      has_many :phone_numbers
    end
    
    如果这导致出现问题,您可以始终将Record用作抽象基类,并生成派生PermanentRecord类来解决此问题:

    class PermanentRecord < Record
    end
    

    然后,您可以使用PermanentRecord代替所有现有代码的记录,它不应该无意中检索UserRecord条目。

    谢谢tadman,我甚至没有想到使用STI,因为用户记录基本上是记录的简化版本(选项较少),这可能是最好的方法。因为我以前没有使用过STI,所以我必须打破旧有的敏捷网络书籍这让我开始了,我还需要阅读有关代表的资料。编辑:在我接受你的答案之前,我将先玩一会儿但我很感激你花时间把这些都写出来。谢谢酷!除非您能够直接使用“默认值”设置缺少的值,而无需执行SQL,即:
    add\u column:records,:type,:string,default:'PermanentRecord'
    UserRecord.destroy_all([ 'created_at<=?', 7.days.ago ])
    
    @records = Record.find(:all)
    
    class PermanentRecord < Record
    end
    
    add_column :records, :type, :string
    execute "UPDATE records SET type='PermanentRecord'"