【问题标题】:Defining methods in Rails migrations在 Rails 迁移中定义方法
【发布时间】:2009-09-27 19:52:24
【问题描述】:

我正在尝试在迁移中定义一个方法,但我收到了一个未定义的方法错误:

undefined method 'do_something_specific' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x4868018>

我宁愿不在其他地方定义它,因为它与应用程序的其余部分没有真正的关系,只是这个特定的迁移。

明确地说,我的迁移类似于:

class DoSomethingSpectacular < ActiveRecord::Migration

  def self.up
    do_something_specific(1, 2)
  end

  def self.down
  end

private

  def do_something_specific(p_1, p_2)
    # something happens here...
  end

end

我在这里遗漏了什么吗?为什么我不能这样定义?

【问题讨论】:

    标签: ruby-on-rails migration


    【解决方案1】:

    正如您从错误消息中看到的那样,代码不是从迁移类中调用的,而是在连接适配器中调用的。我不确定,但这个小改动应该会起作用:

    class DoSomethingSpectacular < ActiveRecord::Migration
    
      def self.up
        DoSomethingSpectacular.do_something_specific(1, 2)
      end
    
      def self.down
      end
    
    private
    
      def self.do_something_specific(p_1, p_2)
        # something happens here...
      end
    
    end
    

    请注意,我将您的方法设为静态并以静态方式调用它。这应该可以解决任何类范围问题。

    【讨论】:

    • 是的,我不明白它从适配器内部调用它的内容,但我认为它应该仍然在它的范围内。无论如何,现在我得到一个错误 undefined method 'do_something_specific' for Class:Class
    • 对不起。由于self.up 本身是一个静态方法,因此对class 的调用将返回Class 而不是DoSomethingSpectacular。我更新了示例代码。
    • 我认为您可以安全地删除“DoSomethingSpectacular”。在self.up中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2023-03-08
    • 2015-09-09
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多