Rails Models: Legacy Schema: Table Inheritance - PullRequest
2 голосов
/ 01 октября 2011

У меня есть устаревшая схема 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, которая может обращаться к обеим таблицам.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

В 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 для устаревшей базы данных

Я бы также порекомендовал книгу "Pro Active Record" ... не уверен, есть ли более новая версия для Rails 3.

2 голосов
/ 20 октября 2011

Оказывается, что после запуска строительных лесов происходит следующее:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...