0

我正在尝试编写一个应用程序来计算病假/休假天数以及员工在任一类别中的可用时间。这是我的麻烦:

在我看来,持续时间方程有效并显示了正确的数字,但我已经把数学放在了视图中,我知道这很糟糕。但是当我尝试在我的员工类中使用持续时间方程时(这样我就可以将数学移出视图)它不起作用,我认为这是因为持续时间由于某种原因被保存为“nil”。我不知道为什么要这样做,因为其他所有内容都与我在表单中输入的任何信息一起保存在数据库中。

也许是因为没有在表单中手动输入持续时间,而是对日期范围做出反应?

这是我想在员工模型中调用持续时间以使数学脱离视图的地方:

  def remaining_vacation_days
    vacation_days - @furlough.duration if @furlough.description == "Vacation"
  end

  def remaining_sick_days
     sick_days - @furlough.duration if @furlough.description == "Sick" 
  end

这是定义持续时间的模型:

class Furlough < ActiveRecord::Base

  attr_accessible :duration # and other stuff
  belongs_to :employee
  validates_presence_of :duration # and other stuff

  def duration
    only_weekdays(date_from..date_to) - psb_holidays
  end

  def only_weekdays(range)
    range.select { |d| (1..5).include?(d.wday) }.size    
  end

  def psb_holidays
    Holidays.between(date_from, date_to, :us, :observed).size
  end

end

让我失望的是,在控制台中我看到的是:

1.9.3-p0 :008 > ryan = Furlough.find(18)
  Furlough Load (0.3ms)  SELECT "furloughs".* FROM "furloughs" WHERE "furloughs"."id" = ? LIMIT 1  [["id", 18]]
 => #<Furlough id: 18, duration: nil, date_from: "2013-12-20", note: "Christmas vacation!", created_at: "2013-05-08 14:33:03", updated_at: "2013-05-08 14:34:07", employee_id: 16, description: "Vacation", date_to: "2013-12-29"> 

看,它是零,但后来我明白了:

1.9.3-p0 :009 > ryan.duration
 => 5 

我不知所措。

4

3 回答 3

3

你应该使用类的实例,而不是类本身,这就是你得到所有这些错误的原因。

def sick_days_used
   Furlough.duration if Furlough.description == "Sick"
end

应该 :

def sick_days_used
   @furlough.duration if @furlough.description == "Sick"
end

或者

def sick_days_used
   self.duration if self.description == "Sick"
end

如果您在模型中定义它

于 2013-05-09T18:52:59.930 回答
0

这些属性是 Furlough 实例的属性,而不是 Furlough 类本身。

于 2013-05-09T18:46:22.330 回答
0

如果要将方法用作类方法,则需要将“self”添加到方法定义中:

def self.duration
  ...
end

然后你可以打电话给 Furlough.duration。

相反(定义持续时间),您正在定义一个实例方法,该方法只能在实例(特定的 Furlogh 实例)上调用。

于 2013-05-09T18:47:50.843 回答