在Ruby中动态访问类模块

时间:2012-05-12 23:57:51

标签: ruby

我的基类是Premade,它有两个子类:PremadeControllerPremadeControllerSession。它们非常相似。例如。他们都需要在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 

这些方法之间的唯一区别是工人阶级(即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 个答案:

答案 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