是否可以计算方法内部的操作数量?

时间:2018-01-23 20:35:51

标签: ruby-on-rails ruby

我不确定'action'是否是正确的词,但假设你有一个看起来像这样的方法:

def schedule_jobs
  User.schedule!      
  Activity.schedule!      
  Event.schedule!
  Notify.schedule! 
end

我正在寻找的是在schedule_jobs方法上运行某种函数,该方法将返回4.

我想要它,因为我会创建一个测试,说明确保安排了4个工作,但是,当我下周添加Report.schedule!时,需要我手动更改4到5。

1 个答案:

答案 0 :(得分:2)

做类似的事情:

class Foo

  JOBS_TO_SCHEDULE = %w(
    User
    Activity
    Event
    Notify
  ).freeze

  def schedule_jobs
    self.class::JOBS_TO_SCHEDULE.each do |job_to_schedule|
      job_to_schedule.constantize.schedule!
    end
  end

end

然后,您可以随时查询Foo::JOBS_TO_SCHEDULE以查看您希望安排的工作数量。

跟进评论:

  

也不需要调用#constantize,因为你可以引用数组中的常量而不是使用字符串。

假设我有一个类Foo,就像这样:

class Foo

  JOBS_TO_SCHEDULE = %w(
    Baz
  ).freeze

  def schedule_jobs
    JOBS_TO_SCHEDULE.each do |job_to_schedule|
      puts job_to_schedule.class.name
      job_to_schedule.schedule!
    end
  end

end

我有一个班级,Baz是这样的:

class Baz

  class << self 

    def schedule!
      puts "scheduled!"
    end

  end

end

如果我致电Foo.new.schedule_jobs,我会得到:

> Foo.new.schedule_jobs
String
NoMethodError: undefined method `schedule!' for "Baz":String

可以看出,job_to_scheduleString(因为,%w()的作用是String创建一个数组NoMethodError。所以,我得到了String,因为schedule!没有回复constantize

但是,如果我包含class Foo JOBS_TO_SCHEDULE = %w( Baz ).freeze def schedule_jobs JOBS_TO_SCHEDULE.each do |job_to_schedule| puts job_to_schedule.class.name job_to_schedule.constantize.schedule! end end end ,请执行以下操作:

Foo.new.schedule_jobs

然后,在致电> Foo.new.schedule_jobs String scheduled! 时,我得到:

#constantize

因此,class Foo JOBS_TO_SCHEDULE = [ Baz ].freeze def schedule_jobs JOBS_TO_SCHEDULE.each do |job_to_schedule| puts job_to_schedule.class.name job_to_schedule.schedule! end end end 的调用是

现在,我可以这样做:

Foo.new.schedule_jobs

在这种情况下,如果我> Foo.new.schedule_jobs Class scheduled! ,我会:

Bar

一切都很好。

  

不需要self.class - 实例方法可以直接访问常量。

假设我有一个类class Bar < Foo end ,就像这样:

Bar.new.schedule_jobs

如果我> Bar.new.schedule_jobs String scheduled! ,那么我得到:

class Foo

  JOBS_TO_SCHEDULE = [
    :baz
  ].freeze

  def schedule_jobs
    JOBS_TO_SCHEDULE.each do |job_to_schedule|
      puts job_to_schedule.class.name
      job_to_schedule.schedule!
    end
  end

end

所以,评论是正确的。

  

引用数组中的常量可能会触发Ruby的自动加载机制,这可能是不可取的。我使用符号。

如果我有:

Foo.new.schedule_jobs

然后当我> Foo.new.schedule_jobs Symbol NoMethodError: undefined method `schedule!' for :baz:Symbol 时,我得到:

class Foo

  JOBS_TO_SCHEDULE = [
    :baz
  ].freeze

  def schedule_jobs
    JOBS_TO_SCHEDULE.each do |job_to_schedule|
      puts job_to_schedule.class.name
      job_to_schedule.constantize.schedule!
    end
  end

end

正如所料。当然,这也不起作用:

Foo.new.schedule_jobs

当我> Foo.new.schedule_jobs Symbol NoMethodError: undefined method `constantize' for :baz:Symbol 时,我得到:

class Foo

  JOBS_TO_SCHEDULE = [
    :baz
  ].freeze

  def schedule_jobs
    JOBS_TO_SCHEDULE.each do |job_to_schedule|
      puts job_to_schedule.class.name
      job_to_schedule.to_s.camelize.constantize.schedule!
    end
  end

end

因为我试图对符号进行限制。我可以做:

Foo.new.schedule_jobs

在这种情况下,当我> Foo.new.schedule_jobs Symbol scheduled! 时,我得到:

.to_s.camelize

一切都好了。 (但是,我必须做Select Window Description ,这是一些打字,我宁愿避免。)