我的表中有一个布尔列,与之相关的日期时间。我希望能够在布尔最初变为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,我将如何保存初始时间的任何帮助将非常感激。提前谢谢
答案 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
非常重要。否则,该字段可能无法更新。