如何比较Rails中的输入数据

时间:2018-05-23 04:52:19

标签: ruby-on-rails

我收集了数据并将它们存储在一个表中。存储totalleveloneleveltwolevelthreerateoneratetworatethreeearn在表"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,两个三个来自用户输入,将首先存储在数据库中,之后我使用数据进行上述比较和计算,完成后,获取数据将存储也进入它。并将结果显示给用户。我应该使用更新做最后一步吗?谢谢所有

2 个答案:

答案 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