当我的系统需要两个同名的类或模块时,我该怎么做才能指明我的意思?
我正在使用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方法。
有任何帮助吗? (并且不要打扰发布“只需将您的模型命名为其他内容。”指出明显的妥协是没有帮助的。)
答案 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