Доступ к пользовательским вспомогательным методам в rails 3 миграции - PullRequest
3 голосов
/ 31 июля 2011

В rails 2 у меня был файл lib /igration_helpers.rb с методами установки и удаления внешних ключей в БД. Эти методы были доступны в self.up и self.down в файлах миграции, добавив в файл миграции

require 'migration_helpers'

вверху и

extend MigrationHelpers

сразу после утверждения класса.

В rails 3 это не работает, и если я пытаюсь запустить миграцию, используя метод set_foreign_key изigration_helpers.rb, выдается следующая ошибка:

==  AddFkToArticles: migrating ================================================
-- set_foreign_key("articles", "book_id", "books")
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `set_foreign_key' for #<AddFkToArticles:0x000001034a1f38>

Tasks: TOP => db:migrate
(See full trace by running task with --trace)

Я уже проверил, что в config / application.rb путь автозагрузки установлен для включения lib. Этот файл действительно необходим, потому что, если я закомментирую оператор require, то разражается жалобным плачом по поводу отсутствующего файла'igration_helpers '.

Я подозреваю, что это проблема с областью видимости (rails 2 использует "def self.up", rails 3 использует "def change") но не могу себе представить, как решить проблему (сейчас я просто скопировал код в файл миграции, просто чтобы убедиться, что он делает то, что должен).

Франческо

1 Ответ

5 голосов
/ 31 июля 2011

Я не знаю, что именно вы пытаетесь выполнить, но вот код, который может дать вам подсказку.

## lib/test_helper.rb
module TestHelper

  def my_table_name
    return :mytable 
  end

end

А затем миграция:

## db/migrate/test_migration.rb
include TestHelper

class TestMigration < ActiveRecord::Migration

  def self.up
    create_table my_table_name
  end

  def self.down
    drop_table my_table_name
  end
end

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

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