【问题标题】:Validations Custom - Compare two variables between new and existing objects (dates) Rails 5验证自定义 - 比较新对象和现有对象(日期)之间的两个变量 Rails 5
【发布时间】:2023-03-15 15:39:01
【问题描述】:

我的 Rails 申请是居住申请。

我有一个模型stay,它是has_many 中的第三个模型:通过tenantflat 之间的关联。停留由checkin_datecheckout_date 定义。我想创建一个自定义验证,以防止创建一个新的stay,如果在给定的时间段内flat 中已经有一个tenant...但我之前从未编写过自定义验证,所以我超级迷茫……

按逻辑,我知道我需要比较“已经存在的记录”和“假定的新记录”的 checkin_date 和 checkout_date。所以我猜它看起来像:(n+1= 新记录 vs. n= 已经存在的记录)

    > def duplicate_stay
    > 
    >  if Stay.exists?(tenant_id: current_tenant.id, studio_id:
    > current_studio.id) && 
    >             checkin_date(n+1) > checkin_date(n)  
    >             checkout_date(n+1) > checkin_date(n)
    >             checkin_date(n+1)  < checkout_date(n)
    >             checkout_date(n+1) < checkout_date(n) 
    > == false 
    >             else 
    > == true (the model can be created)  
end

有人可以帮助我吗?我一直在寻找,但我知道该怎么做!

【问题讨论】:

    标签: ruby-on-rails validation date


    【解决方案1】:

    尝试使用cover? 方法。你可以这样使用它:

    today = Date.today
    in_one_week = today + 7.days
    search_date = today + 3.days
    
    (today..in_one_week).cover? search_date
    => true
    

    【讨论】:

      【解决方案2】:

      这未经测试,但如果您向 Stay 类添加了范围:

      scope :overlaps, ->(stay) {
        where(
          tenant_id: stay.tenant_id,
          studio_id: stay.studio_id,
        ).
        where(arel_table[:checkin_date].lt(stay.checkout_date)).
        where(arel_table[:checkout_date].gt(stay.checkin_date))
      }
      

      ...对于Stay @stay 的实例,如果有任何实例与@stay 重叠,则调用Stay.overlaps(@stay).exists? 将返回true。

      如果这不起作用,请告诉我。如果您不确定为什么某些事情没有按照您认为的方式工作,那么查看作为验证的一部分执行的 SQL 通常会很有帮助。

      编辑:这里的一个棘手的事情是一个逗留与自身重叠,所以如果@stay 被成功保存(即它分配了一个id)你可能有这个逻辑的问题。不过,您可以根据记录是否保存提供不同的逻辑。

      我认为这样做可以:

      scope :overlaps, ->(stay) {
        logic = where(
          tenant_id: stay.tenant_id,
          studio_id: stay.studio_id,
        ).
        where(arel_table[:checkin_date].lt(stay.checkout_date)).
        where(arel_table[:checkout_date].gt(stay.checkin_date))
      
        logic = logic.where.not(id: stay.id) unless stay.new_record?
      
        logic
      }
      

      【讨论】:

        猜你喜欢
        • 2014-02-02
        • 1970-01-01
        • 2011-10-24
        • 2013-09-21
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多