代码之家  ›  专栏  ›  技术社区  ›  sirramongabriel

Rails 4.2-最后一条记录的创建时间是否超过1天?

  •  0
  • sirramongabriel  · 技术社区  · 7 年前

    我有几个类需要每天创建一个记录/对象,以便在我的应用程序中被认为是“最新的”。

    以下是我用来确定最新记录创建时间的方法。

    class Resident < ActiveRecord::Base
      .
      .
      .
      def medical_record_expired?
        if self.medical_record_forms.last.created_at::time <= 1.day.ago
          true
        else
          false
        end
        # ((Time.current - self.medical_record_forms.last.created_at)/3600).to_i
      end
    
      def personal_care_log_expired?
        if self.personal_care_forms.last.created_at::time <= 1.day.ago
          true
        else
          false
        end
        # ((Time.current - self.personal_care_forms.last.created_at)/3600).to_i
      end
    end
    

    我最近的医疗报告日期是2017年12月17日 MedicalRecord visual

    我最近的个人护理日期是2017年12月21日 enter image description here

    这是我不久前建立的东西,我过去认为 object.created_at <= 1.day_ago 对于任何小于1天的日期,都将返回true。

    我正在使用postgresql 21,下面是我的时区配置:

    enter image description here

    我可以在控制台中运行这些方法的内部构件,因此我认为这可能是一个时区转换问题。

    但我已经尝试了很多有助于时区和其他场景的方法,例如开始\u of\u day、::time和:to\u I来计算已经过去的小时数,如果小于24小时的记录是“最新的”,则超过24小时。

    我还将包括我的观点,以防我有什么倒退。

    medical\u记录片段:

    <% if resident.medical_record_expired? %>
      <td class="text-center move-row">
        <label class="label label-danger">
          Record outdated, 
          <%= link_to "<span class='pad-all text text-lg text-primary'>click here</span>".html_safe, new_resident_medical_record_form_path(resident.id) %>
          to create.
        </label>
      </td>
    <% else %>
      <td class="text-center move-row">
        <label class="label label-table label-success">Up to date!</label>
      </td>
    <% end %>
    

    personal\u care\u日志片段:

    <% if resident.personal_care_log_expired? %>
      <td class="text-center move-row">
        <label class="label label-danger">
          Record outdated, 
          <%= link_to "<span class='pad-all text text-lg text-primary'>click here</span>".html_safe, new_resident_personal_care_form_path(resident.id) %>
          to create.
        </label>
      </td>
    <% else %>
      <td class="text-center move-row">
        <label class="label label-table label-success">Up to date!</label>
      </td>
    <% end %>
    

    我有兴趣了解我忽视/误用了哪些东西,这些东西阻碍了我达到这一目的。

    2017年12月26日更新

    按照下面概述的步骤,我能够确定只有一个居民及其嵌套关联存在此问题, resident.personal_care_forms.last . 上次创建的\u在几天前正在打印 (12/21) ,即使最新的记录是今天创造的 (12/26) .

    尝试添加新时 personal_care_forms 对于其他居民来说,有条件的最新记录 created_at 日期如预期。

    我不知道为什么 居民personal\u care\u表单。最后的 我今天也创造了一个新记录,但仍然没有意识到这一点。我可以重建数据库,因为这不是生产数据的问题。

    非常感谢调试提示,因为它帮助我更轻松地进行推理。

    1 回复  |  直到 7 年前
        1
  •  1
  •   draganstankovic    7 年前

    易于理解的 self.personal_care_forms.last.created_at < 1.day.ago 在控制台和应用程序中的工作和行为应相同。

    尝试像这样将日志添加到常驻类中(注意,我还折叠了布尔返回),看看您得到了什么:

    class Resident < ActiveRecord::Base
      .
      .
      .
      def medical_record_expired?
        puts "created_at: #{medical_record_forms.last.created_at} 1.day.ago: #{1.day.ago}"
        self.medical_record_forms.last.created_at < 1.day.ago
      end
    
      def personal_care_log_expired?
        puts "created_at: #{personal_care_forms.last.created_at} 1.day.ago: #{1.day.ago}"
        self.personal_care_forms.last.created_at < 1.day.ago
      end
    end