Posts Tagged ‘drop_table’

Ruby on Rails estendendo as migrações com helpers

Postado em 24 mar 2009
Categoria(s) Ruby on Rails

É 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: Recommend Me.

  • Share/Bookmark