我的基类是Premade
,它有两个子类:PremadeController
和PremadeControllerSession
。它们非常相似。例如。他们都需要在1000个批量中在MySQl中构建记录,但我希望PremadeControllers
之前构建,因此我让它们在Resque中进入不同的队列。
所以这两个子类看起来像这样:
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
这些方法之间的唯一区别是工人阶级(即BuildPremadeControllerSessionJob
和BuildPremadeControllerJob
)
我试图将它放在父级中并动态定义常量,但它可能由于范围问题而无法正常工作。例如:
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的工作人员语法,因为这不是我要问的问题。
答案 0 :(得分:3)
您应该可以使用const_get
-
klass = Workers.const_get "Build#{self.name}Job"
答案 1 :(得分: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