如何在Ruby on Rails中创建计算每英里分钟数的方法

时间:2016-09-23 00:20:09

标签: ruby-on-rails ruby methods

在我的Rails 4.2.6 / Ruby 2.2.4项目中,我有一个有氧运动模型,有持续时间,距离和平均速度场。 “持续时间”和“平均速度”是时间数据类型; “distance”是十进制数据类型。我需要帮助编写一种方法来根据用户在持续时间和距离字段中的输入来计算用户的平均速度(每英里分钟数)。

*编辑*

我的有氧运动形式的持续时间和距离字段(_form.html.erb):

  <div class="cardio_duration">
    <%= f.input :duration do %> <br>   
    <%= f.time_select :duration, :include_blank => true, include_seconds: true %>
    <% end %>
  </div>

  <div class="cardio-time"> 
    <%= f.input :distance, :include_blank => true %>
    <% end %>
 </div>

以下是我在有氧运动模型中编码的内容:

before_save { self.average_pace = self.calculate_average_pace } # calls calculate average pace method

据我所知,在计算每英里的分数时,时间因素在等式中排在最前面。这是我写的方法:

def calculate_average_pace
    duration = self.duration
    distance = self.distance
    average_pace = duration / distance
end

执行此方法时,会生成以下错误:

undefined method `/' for 2000-01-01 16:50:00 UTC:Time

我正在尝试做这样的事情:26分钟/1.17英里,相当于每英里22.29分钟。我该如何更改代码来解决问题?感谢您的帮助和帮助解释

**编辑**

这是相关的数据库架构:

  create_table "cardio_exercises", force: :cascade do |t|
    ...
    t.datetime "created_at"
    t.datetime "updated_at"
    t.time     "duration"
    t.decimal  "distance"
    t.time     "average_pace"
  end

1 个答案:

答案 0 :(得分:1)

您收到undefined_method错误,因为您试图将Time除以Decimal。只能分割数值。

我试图像这样实现这个功能。

# _form.html
# ...
  <div class="field">
    <%= f.label :duration %><br>
    <%= f.time_select :duration, include_blank: false, include_seconds: true %>
  </div>
# ...

# Cardio model
class Cardio < ActiveRecord::Base
  before_save :set_mpm

  def set_mpm
    # find minutes from time entered by user
    mins = duration.hour * 60 + duration.min + duration.sec / 60
    self.mpm = mins / distance
  end
end

# controller
  def create
    @cardio = Cardio.new(cardio_params)

    respond_to do |format|
      if @cardio.save
        format.html { redirect_to @cardio, notice: 'Cardio was successfully created.' }
        format.json { render action: 'show', status: :created, location: @cardio }
      else
        format.html { render action: 'new' }
        format.json { render json: @cardio.errors, status: :unprocessable_entity }
      end
    end
  end

结果如下

Result

这对你有用吗?

<强>更新

10小时1小时为我工作。

Result2

这是我的数据库架构。

  create_table "cardios", force: :cascade do |t|
    t.time     "duration"
    t.decimal  "distance"
    t.decimal  "mpm"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end