2016-09-13 2 views
0

У меня есть модель с именем employee. Ниже приведен файл миграции.Как установить внешний ключ в Rails

class CreateEmployees < ActiveRecord::Migration 
    def change 
     create_table :employees, id: false do |t| 
      t.string :name 
      t.string :password 
      t.string :role 
      t.primary_key :name 
     end 
    end 
end 

Теперь я хочу, чтобы создать модель под названием «TeamPlayer» с колоннами, как «имя», который должен ссылающийся столбец «имя» в модели работника. И колонка 'tl' , которая не зависит от этой модели. Следующим является файл миграции «teamplayer».

class CreateTeamplayers < ActiveRecord::Migration 
    def change 
     create_table :teamplayers, :id false do |t| 
      t.string :tl 
      t.string :name 
     end 
    end 
end 

В вышеприведенном файле, как ссылку «имя» на сотрудника модели? Итак, как добиться внешнего ключа в рельсах.

+0

я бы не создать таблицу без ПК. –

ответ

0

Я думаю, что вы хотите посмотреть в Active Record Ассоциаций (http://guides.rubyonrails.org/association_basics.html)

Я знаю, что вы просили, чтобы создать внешний ключ на name, но если вы не планируете, чтобы гарантировать, что имя уникально, то это, возможно, не лучший план (в зависимости от фактических отношений, которые вы пытаетесь моделировать - от одного до многих/один к одному и т. д.).

У меня возникнет соблазн установить отношение внешнего ключа на employees.id. Для этого вы можете использовать ассоциации has_many и belongs_to.

Вы можете изменить teamplayers миграцию следующим образом:

class CreateTeamplayers < ActiveRecord::Migration 
    def change 
    create_table :teamplayers, :id false do |t| 
     t.belongs_to :employee 
     t.string :tl 
    end 
    end 
end 

Затем в Employee модели, вы можете добавить has_many сторону вещей:

class Employee < ActiveRecord::Base 
    has_many :teamplayers 
end 

Вы все еще можете легко получить имя сотрудника учитывая запись Team Player с простым соединением.

Edit - получить Работник, вы можете сделать что-то вроде этого, предполагая, что @t является экземпляр TeamPlayer:

@t.employee.name 

(код не тестировался, и из памяти так ....)

+0

Как указать столбец «имя», который находится в модели «employee» в модели «teamplayer»? – mrg

+0

См. Редактирование, но в основном, если у вас есть экземпляр teamplayer, вы получаете имя сотрудника с именем '@ t.employee.name' –

0

вы можете сделать это в модели TeamPlayer, вам просто нужно добавить индекс в вашей миграции

class CreateTeamplayers < ActiveRecord::Migration 
    def change 
    create_table :teamplayers, :id false do |t| 
     t.string :tl 
     t.string :name 
    end 
    add_index :teamplayers, :name 
    end 
end 

вы можете установить имя в качестве первичного ключа внутри модели работника, как это

Теперь внутри модели TeamPlayer вы можете установить внешний ключ

class Teamplayer < ActiveRecord::Base 
    belongs_to :employee, foreign_key: 'name' 
end 

Это должно ссылаться на «имя» для модели сотрудника

Смежные вопросы