我收集了数据并将它们存储在一个表中。存储total
,levelone
,leveltwo
,levelthree
,rateone
,ratetwo
,ratethree
和earn
在表"Rate"
中,来自用户输入。
我写了一个代码来从表中取出数据并按以下方式进行计算:
if @rate.total < @rate.levelone
@rate.earn = @rate.total * @rate.rateone
@earn = @rate.earn
elsif @rate.levelone < @rate.total <= @rate.leveltwo
@rate.earn = @rate.levelone * @rate.rateone
+(@rate.total - @rate.levelone) * @rate.ratetwo
@earn = @rate.earn
elsif @rate.leveltwo < @rate.total <= @rate.levelthree
@rate.earn = @rate.levelone* @rate.rateone
+(@rate.leveltwo - @rate.levelone) * @rate.ratetwo
+(@rate.total - @rate.leveltwo) * @rate.ratethree
@earn = @rate.earn
它显示:
undefined method `total' for nil:NilClass
我不知道这里发生了什么。有没有办法取出数据并进行比较?
我使用form_for进行创建操作,在存储到数据库之后,我拿出一些数据进行比较,一旦完成,将结果存储在另一列中,非常复杂,如下所示:
create_table:rate do | t |
t.decimal :total
t.decimal :earn
t.decimal :levelone
t.decimal :leveltwo
t.decimal :levelthree
t.decimal :rateone
t.decimal :ratetwo
t.decimal :ratethree
总计,levelone,two,three和rateone,两个三个来自用户输入,将首先存储在数据库中,之后我使用数据进行上述比较和计算,完成后,获取数据将存储也进入它。并将结果显示给用户。我应该使用更新做最后一步吗?谢谢所有
答案 0 :(得分:1)
正如我的评论中所提到的,如果你需要进行计算然后存储数据,你可以使用例如before_save
回调来完成。
代码应该是这样的。
class Rate < ActiveRecord::Base
before_save :make_calculation
def make_calculation
if self.total < self.levelone
self.earn = self.total * self.rateone
elsif self.levelone < self.total <= self.leveltwo
self.earn = self.levelone * self.rateone + (self.total - self.levelone) * self.ratetwo
elsif self.leveltwo < self.total <= self.levelthree
self.earn = self.levelone * self.rateone + (self.leveltwo - self.levelone) * self.ratetwo + (self.total - self.leveltwo) * self.ratethree
end
end
self
是正在处理以保存到数据库的Rate类的对象。
答案 1 :(得分:0)
在比较之前,请检查@rate
是否为not nil
。这样就可以避免nil
错误。或者您也可以if @rate.present?
unless @rate.blank?
if @rate.total< @rate.levelone
@rate.earn = @rate.total * @rate.rateone
@earn = @rate.earn
elsif @rate.levelone < @rate.total <= @rate.leveltwo
@rate.earn = @rate.levelone* @rate.rateone
+(@rate.total-@rate.levelone) *@rate.ratetwo
@earn = @rate.earn
elsif @rate.leveltwo < @rate.total <= @rate.levelthree
@rate.earn = @rate.levelone* @rate.rateone
+(@rate.leveltwo-@rate.levelone) *@rate.ratetwo
+(@rate.total-@rate.leveltwo)*@rate.ratethree
@earn = @rate.earn
end