我有一个遗留的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;
在此设计中,Employee是域模型中的用户。即员工的“id”字段是引用User.id的外键。
如何使用Rails 3.0模型和迁移对此关系进行编码? 例如,如果我跑了
rails g scaffold User userType:string seqNo:integer
它会让我得到一个Rails数据库迁移,它会生成一个非常相似的模式,以及一个可以访问该表的模型。但是,我不知道如何将Employee表与Employee.id一起作为引用User.id的外键,以及获取可以访问这两个表的Employee模型。
我该如何做到这一点?
答案 0 :(得分: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时不会更改数据库。
答案 1 :(得分:2)
Rails有几种选择可以使用遗留数据库模式,例如:在定义迁移时或定义关系时。
以下是一些提示:
http://www.slideshare.net/napcs/rails-and-legacy-databases-railsconf-2009
http://www.killswitchcollective.com/articles/45_legacy_data_migration_with_activerecord
http://sl33p3r.free.fr/tutorials/rails/legacy/legacy_databases.html
http://lindsaar.net/2007/11/26/connecting-active-record-to-a-legacy-database-with-stored-procedures
http://pragdave.blogs.pragprog.com/pragdave/2006/01/sharing_externa.html
ActiveRecord Join table for legacy Database
我还推荐“Pro Active Record”一书......不确定是否有适用于Rails 3的新版本。