É muito comum termos nas migrações instruções sql para criar chaves estrangeiras e o rails não tem métodos para criar-las.
Por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class CreateGameTeams < ActiveRecord::Migration def self.up create_table :game_teams do |t| t.references :team, :null => false t.references :game, :null => false t.timestamps end execute "ALTER TABLE game_teams ADD CONSTRAINT fk_game_team_teams FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE CASCADE ON UPDATE CASCADE" execute "ALTER TABLE game_teams ADD CONSTRAINT fk_game_team_games FOREIGN KEY (game_id) REFERENCES games (id) ON DELETE CASCADE ON UPDATE CASCADE" end def self.down drop_table :game_teams end end |
Para simplificar mais as coisas, é possível criar helpers e estender as funcionalidades das migrações, é isso que será feito para criar um método que gera as chaves estrangeiras (foreign key).
Faça o seguinte:
No diretório lib do projeto crie o arquivo migration_helpers.rb com o conteúdo abaixo:
1 2 3 4 5 6 7 8 9 | module MigrationHelpers def foreign_key(from_table, from_column, to_table) constraint_name = "fk_#{from_table}_#{from_column}" execute %{alter table #{from_table} add constraint #{constraint_name} foreign key (#{from_column}) references #{to_table}(id)} end end |
Agora é possível adicionar esse método a qualquer migração acrescentando as linhas a seguir no início do arquivo de migração:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | require "migration_helpers" class CreateGameTeams < ActiveRecord::Migration extend MigrationHelpers def self.up create_table :game_teams do |t| t.references :team, :null => false t.references :game, :null => false t.timestamps end foreign_key(:game_teams, :team_id, :teams) foreign_key(:game_teams, :game_id, :games) end def self.down drop_table :game_teams end end |
A linha require coloca a definição do módulo no código de migração e a linha extend adiciona os métodos do módulo MigrationHelpers à migração como métodos de classe.
Se você gostou desse texto e acha que ajudou você, me recomende:
.
