Ruby:导入两个同名的模块/类

时间:2010-11-16 01:51:23

标签: ruby-on-rails

当我的系统需要两个同名的类或模块时,我该怎么做才能指明我的意思?

我正在使用rails(新的),我的一个模型名为“Thread”。当我尝试在thread_controller.rb中引用类“Thread”时,系统返回一些同名的其他常量。

<thread.rb>
class Thread < ActiveRecord::Base

  def self.some_class_method
  end

end

<thread_controller.rb>
class ThreadController < ApplicationController

  def index
    require '../models/thread.rb'
    @threads = Thread.find :all
  end

end

当我尝试Thread.find()时,我得到一个错误,说Thread没有名为find的方法。当我访问Thread.methods时,我在其中找不到我的some_class_method方法。

有任何帮助吗? (并且不要打扰发布“只需将您的模型命名为其他内容。”指出明显的妥协是没有帮助的。)

3 个答案:

答案 0 :(得分:2)

不,真的为你的模特命名别的东西。

Thread是Ruby中的保留常量,并且覆盖该常量只会让您遇到麻烦。我为my application做了妥协,并将其称为Topic

答案 1 :(得分:2)

如果绝对必须覆盖现有常量,可以执行以下操作:

# use Object to make sure Thread is overwritten globally
# use `send` because `remove_const` is a private method of Object
# Can use OldThread to access already existing Thread
OldThread = Object.send(:remove_const, :Thread)

# define whatever you want here
class MyNewThread 
  ...
end

# Now Thread is the same as MyNewThread
Object.send(:const_set, :Thread, MyNewThread)

显然,任何依赖于预先存在的Thread的东西都会被破坏,除非你做了某种猴子修补。

仅仅因为这种事情可以做到,并不意味着应该这样做。但在某些情况下,它可以很方便,例如在测试中,您可以使用自己的“哑”对象覆盖远程数据源。

答案 2 :(得分:2)

您可以将应用程序放入自己的命名空间。

<my_app/thread.rb>
module MyApp
  class Thread
  end
end