在我的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
答案 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
结果如下
这对你有用吗?
<强>更新强>
10小时1小时为我工作。
这是我的数据库架构。
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