有没有办法跟踪布尔最初在rails中变为true的时间?

时间:2017-12-09 17:34:51

标签: ruby-on-rails datetime boolean

我的表中有一个布尔列,与之相关的日期时间。我希望能够在布尔最初变为true时跟踪。在我试过的模型中

def example
  if boolean_field == true
   datetime_field = time.now
  end
end

但问题是当布尔值设置为true时,每次重新加载页面或数据库时,datetime_field都会不断更新,因为布尔值始终处于常量状态true。我还尝试使用rails脏:

boolean_field_changed?

但该方法似乎根本不更新datetime列。 P.S我对方法有一个before_save回调。

 def returned_time
    if self.returned?
      returned_at = Time.now
    end
 end


 before_save :returned_time

一旦boolean_field从false变为true,我将如何保存初始时间的任何帮助将非常感激。提前谢谢

1 个答案:

答案 0 :(得分:0)

如果returned是表格中的布尔列,那么您不需要ActiveModel::Dirty。该模块用于为非数据库属性添加更改检测。您应该能够使用Active Record的内置changed?方法:

class MyModel < Application Record

  before_save :returned_time

  def returned_time
    if self.returned? and self.returned_changed?
      self.returned_at = Time.now
    end
  end

end

如果returned_at为真且该字段已更改,则会更新returned时间。这可能适合您的业务逻辑。

但是,如果您的目标是仅在退回图书时更新returned_at字段,则可能需要检查是否存在returned_at日期:

def returned_time
  if self.returned? and self.returned_at.blank?
    self.returned_at = Time.now
  end
end

如果已退回图书并且没有返回日期,则只会更新日期。

最后一点,self returned_at之前的self.returned_at = Time.now非常重要。否则,该字段可能无法更新。