【问题标题】:Rails Models: Legacy Schema: Table InheritanceRails 模型:旧模式:表继承
【发布时间】:2011-10-20 05:30:01
【问题描述】:

我有一个旧的 SQL 模式,看起来像这样:

CREATE TABLE `User` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `userType` varchar(255) DEFAULT NULL,
  `seqNo` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

CREATE TABLE `Employee` (
  `userType` varchar(255) DEFAULT NULL,
  `id` bigint(20) NOT NULL,
  `employeeNumber` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FKB65C8D4DB07F537D` (`id`),
  CONSTRAINT `FKB65C8D4DB07F537D` FOREIGN KEY (`id`) REFERENCES `User` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在此设计中,员工是域模型中的用户。即员工的“id”字段是引用 User.id 的外键。

我将如何编码这种与 Rails 3.0 模型和迁移的关系? 例如,如果我跑了

rails g scaffold User userType:string seqNo:integer 

它会给我一个 Rails 数据库迁移,它会生成一个非常相似的模式,以及一个可以访问该表的模型。但是,我不确定如何获取 Employee.id 作为引用 User.id 的外键的 Employee 表,以及获取可以访问这两个表的 Employee 模型。

我怎样才能做到这一点?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    【讨论】:

    • 优秀的答案!尤其是第三个。他发现了一大堆我不会想到但需要的问题,尤其是在使用 set_sequence_name 时。
    【解决方案2】:

    原来运行脚手架后如下:

    rails g scaffold User userType:string seqNo:integer
    rails g scaffold Employee id:integer  userType:string employeeNumber:string
    

    然后我必须将模型编辑为如下所示:

    class User < ActiveRecord::Base
       has_one :employee
    end
    
    class Employee < ActiveRecord::Base
         belongs_to :user, :foreign_key=>"id"
    end
    

    唯一要做的另一件事是删除生成的迁移,以便在调用 rake db:migrate 时不会更改数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多