2012-05-12 79 views
0

我的基类是Premade,它有两个子类:PremadeControllerPremadeControllerSession。他们非常相似。例如。他们都需要在MySQl中分批创建1000条记录,但我希望PremadeControllers能够在之前建成,因此我让他们在Resque中进入不同的队列。在Ruby中动态访问类模块

所以两个子类是这样的:

class PremadeController < Premade 

    def self.maintain 
    ((max_premade_count - premade_count)/batch_size).times do 
     Resque.enqueue(Workers::BuildPremadeControllerJob) 
    end 
    end 

end 

和:

class PremadeSessionController < Premade 

    def self.maintain 
    ((max_premade_count - premade_count)/batch_size).times do 
     Resque.enqueue(Workers::BuildPremadeControllerSessionJob) 
    end 
    end 

end 

这些方法之间的唯一区别就是工人阶级(即BuildPremadeControllerSessionJobBuildPremadeControllerJob

我试图把它放在父类中并动态地定义这个常量,但是这可能是由于范围问题导致的。例如:

class Premade 

    def self.maintain 
    ((max_premade_count - premade_count)/batch_size).times do 
     Resque.enqueue(Workers::) 
    end 
    end 

end 

我想要做的就是在父定义此方法,如:

def self.maintain 
    ((max_premade_count - premade_count)/batch_size).times do 
    Resque.enqueue(Workers::build_job_class) 
    end 
end 

build_job_class在每个子类中定义。

请不要告诉我改变Resque的工作者语法,因为这不是我问的问题。

回答

2

你应该能够const_get做到这一点 -

klass = Workers.const_get "Build#{self.name}Job" 
+0

这个应用程序是在1.8.7。看起来只有1.9.3。那是对的吗? – s84

+0

'const_get' [可在1.8.7上使用](http://ruby-doc.org/core-1.8.7/Module.html#method-i-const_get) – x1a4

+0

好,很好。将有一个尝试。 – s84

1

这样做将是对你的2类,返回相应的工作人员类中定义的build_job_class类方法的一种方式,即PremadeSessionController会是什么样子

class PremadeSessionController 
    def self.build_job_class 
    Workers::BuildPremadeControllerSessionJob 
    end 
end 

那么你的保养方法,改为

def self.maintain 
    ((max_premade_count - premade_count)/batch_size).times do 
    Resque.enqueue(build_job_class) 
    end 
end