【问题标题】:Accessing custom helper methods in rails 3 migrations在 Rails 3 迁移中访问自定义辅助方法
【发布时间】:2011-08-01 02:21:55
【问题描述】:

在 rails 2 中,我有一个 lib/migration_helpers.rb 文件,其中包含在数据库中设置和删除外键的方法。 通过在迁移文件中添加这些方法,在迁移文件中的 self.up 和 self.down 中可用

require 'migration_helpers'

在顶部,和

extend MigrationHelpers

紧跟在类声明之后。

在 rails 3 这不起作用,如果我尝试使用 migration_helpers.rb 中的 set_foreign_key 方法运行迁移,则会引发以下错误:

==  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 语句,那么 rails 就会抱怨丢失的“migration_helpers”文件。

我怀疑这是一个范围问题(rails 2 使用“def self.up”,rails 3 使用“def change”) 但无法想象如何解决问题(现在我只是复制了迁移文件中的代码,只是为了检查它是否做了它应该做的事情)。

弗朗切斯科

【问题讨论】:

    标签: ruby-on-rails-3 rails-migrations


    【解决方案1】:

    我不知道你到底想完成什么,但这里有一些代码可能会给你一个线索。

    ## 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 类中包含这个帮助器是行不通的,所以它应该在外面。

    【讨论】:

    • 我必须将 require File.expand_path('../../../lib/test_helper', FILE) 添加到我的迁移文件顶部。没有它,它就行不通。
    • 如果您希望 mixin 与您的类方法(如 up 和 down)一起使用,您需要在类中 extend TestHelper