在控制器中调用类/实例方法

时间:2015-10-07 19:09:56

标签: ruby-on-rails ruby

我刚开始为员工整理一个应用技能矩阵的应用程序。

每位员工都有3个评分。一个来自他们自己,一个来自他们的经理,一个来自技能专家。

我想让每位员工根据上述3个分数和相应的权重(40%,20%,40%)进行加权分数。

我假设我需要在我的模型中创建某种方法,例如:

def self.calc_weight
  a = Rating.find(params[:id])
  b = a.emp_score *.4
  c = a.mgr_score *.2
  d = a.sme_score *.4
  e = b + c + d
  a.wgt_score = e
end

我知道这是不正确的语法。这是正确的方法还是应该在创建评级后由我的控制器处理?如果是这样我会定义哪个控制器动作?如果我要使用一种方法,我也有同样的问题。我相信这也是一个更好的方法。

1 个答案:

答案 0 :(得分:2)

我假设你的模特有一些关系,比如

class Rating < ActiveRecord::Base
  belongs_to :employee
end

class Employee < ActiveRecord::Base
  has_one :rating
end

如果是这样,您只需要向Employee模型添加方法,例如:

def weight
  (rating.emp_score * 0.4 +
    rating.mgr_score * 0.2 +
    rating.sme_score * 0.4).to_i # for integer value
end

并将其称为@employee.weight

如果您想将属性wgt_score添加到评级模型并在评级对象更新时更新它 - 那么您必须将before_save(例如)回调添加到评级模型,如:

class Rating < ActiveRecord::Base
  belongs_to :employee
  before_save :update_weight
  # ...
  private
  def update_weight      
    self.wgt_score = (emp_score * 0.4 +
                      mgr_score * 0.2 +
                      sme_score * 0.4)
  end
end