在Ruby(Rails)中的ActiveRecord对象的属性上重复相同的代码块

时间:2015-05-29 21:19:16

标签: ruby-on-rails ruby activerecord

我有一个基本功能,它为杠铃举重采用不同的重量和代表值,并将其转换为估计的一个代表最大值,它存储在我的数据库中。以下是代码目前的样子:

  if deadlift_reps != 1
    self.deadlift = deadlift_wt * deadlift_reps * 0.0333 + deadlift_wt
  else
    self.deadlift = deadlift_wt
  end

  if squat_reps != 1
    self.squat = squat_wt * squat_reps * 0.0333 + squat_wt
  else
    self.squat = squat_wt
  end

  if benchpress_reps != 1
    self.benchpress = benchpress_wt * benchpress_reps * 0.0333 + benchpress_wt
  else
    self.benchpress = benchpress_wt
  end

  if overheadpress_reps != 1
    self.overheadpress = overheadpress_wt * overheadpress_reps * 0.0333 + overheadpress_wt
  else
    self.overheadpress = overheadpress_wt
  end

我显然在这个代码块中重复了很多,但是无法弄清楚如何将其分解并插入方法名称。我尝试过使用带

的数组
  lifts = [deadlift, squat, benchpress, overheadpress]

但是当我尝试使用每个对此进行字符串插值时,我收到的错误是提升没有这种方法。

有人可以就如何继续提供任何建议吗?

编辑:

我试图做的循环是:

lifts = [deadlift, squat, benchpress, overheadpress]

lifts each do |lift|
  if '#{lift}_reps' !=1
    self.#{lift} = '#{lift}_wt' * '#{lift}_reps' * 0.0333 + '#{lift}'_wt
  else
    self.#{lift} = '#{lift}_wt'
  end
end

我可以看到为什么这不起作用,但是,使用类似的想法,我将如何使它工作?

1 个答案:

答案 0 :(得分:0)

我会创建一个私有方法来计算每一部分:

if deadlift_reps != 1
   ...
end

使用 assign_attributes Active记录方法将值分配给不同的字段(deadlift,squat,benchpress,overheadpress)。

这是代码,我没有测试它,但它应该可以工作:

  [["deadlift", 20, 8], 
   ["squat", 10, 12],
   ["benchpress", 30, 6],
   ["overheadpress", 20, 10]]).each do |exercize, wt, reps|
    set_exercize(exercize, wt, reps)
  end

  private

  def set_exercize(exercize, wt, reps)
    value = reps != 1 ? wt * reps * 0.0333 + wt : wt
    self.assign_attributes(exercize => value)
  end

我希望它可以帮到你。