我不确定'action'是否是正确的词,但假设你有一个看起来像这样的方法:
def schedule_jobs
User.schedule!
Activity.schedule!
Event.schedule!
Notify.schedule!
end
我正在寻找的是在schedule_jobs方法上运行某种函数,该方法将返回4.
我想要它,因为我会创建一个测试,说明确保安排了4个工作,但是,当我下周添加Report.schedule!
时,需要我手动更改4到5。
答案 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_schedule
是String
(因为,%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
,这是一些打字,我宁愿避免。)