如何将某些内容转换为Ruby Proc?

时间:2014-05-29 20:59:20

标签: ruby ruby-on-rails-3 foreach

if j.job_type_name
  j.type = j.job_type_name
elsif j.type.length > 1
  # jty = Jobtype.find_by_id(j.type)
  # We don't want to relentlessly hit the db for JobTypes, Colors, Priorities, etc. so we use the stored 'all' variable
  jty = allJobTypes.find { |h| h['_id'] == BSON::ObjectId(j.type) }
  j.type = jty && jty.job_type ? jty.job_type : 'N/A'
end

if j.priority_name
  j.priority = j.priority_name
elsif j.priority
  pri = Jobpriority.find_by_id(j.priority)
  j.priority = !pri.blank? && !pri.job_priority.blank? ? pri.job_priority : 'N/A'
end

我有两个if else块,我认为它们作为Procs更好,但我仍然围绕Proc是什么。它只是我想要经常调用的一段代码,放在一个地方,这样我只需要在那个地方更新它。它不是一个对象本身的方法,而只是一些重复的代码。

那么上面的语法是什么?

您没有看到的代码(设置'j'的地方)是数据库游标上的.each循环。

所以Job.where(stuff).each do |j|

1 个答案:

答案 0 :(得分:3)

制作proc的语法只是:

my_proc = proc do |arglist|
  # code here
end

如果需要,您还可以使用Proc.new代替proc

你应该能够制作一个proc,然后将其作为块传递给.each,(但我不知道这会给你带来什么):

def process_jobs(stuff)
  process_job = proc do |j|
    if j.job_type_name
      #...
    end
  end
  Job.where(stuff).each(&process_job)
end