ruby-on-rails – 识别在rails中创建的冲突日期

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 识别在rails中创建的冲突日期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
预订应用程序.如何检查或验证日期,例如date_start和date_end的值为
  1. date_start date_end
  2. 26-11-2017 27-11-2017

我将创建另一个具有这些起始和结束日期值的保留,但它与其他值冲突.如何查看有冲突的日期?

  1. date_start date_end
  2. 25-11-2017 28-11-2017

用它来验证两者之间的日期

模型

  1. validate :no_reservation_overlap
  2.  
  3. scope :overlapping,->(period_start,period_end) do
  4. where "((date_start <= ?) and (date_end >= ?))",period_end,period_start
  5. end
  6.  
  7. private
  8.  
  9. def no_reservation_overlap
  10. if (Reservation.overlapping(date_start,date_end).any?)
  11. errors.add(:date_end,'it overlaps another reservation')
  12. end
  13. end

查看 – 选择日期

  1. <%= f.label :'date_start:' %>
  2. <%= f.date_field :date_start %>
  3.  
  4. <%= f.label :'date_end:' %>
  5. <%= f.date_field :date_end %>

样本日期26到27已经预订/保留,据说它必须防止插入25到28,因为已经预订了26到27.

解决方法

模型:
  1. class Reservation < ApplicationRecord
  2. validate :overlapping
  3. private
  4. def overlapping
  5. if Reservation.where('? < date_end and ? > date_start',self.date_start,self.date_end).any?
  6. errors.add(:date_end,'it overlaps another')
  7. end
  8. end

架构:

  1. create_table "reservations",force: :cascade do |t|
  2. t.date "date_start"
  3. t.date "date_end"
  4. t.datetime "created_at",null: false
  5. t.datetime "updated_at",null: false
  6. end

这是我尝试创建(24 nov – 27 nov)和(25 nov – 27 nov)时有轨道控制台日志(25 nov – 26 nov)

  1. irb(main):003:0> Reservation.create date_start: Date.parse('25-11-2017'),date_end: Date.parse('26-11-2017')
  2. (0.2ms) BEGIN
  3. (0.6ms) SELECT COUNT(*) FROM "reservations" WHERE ('2017-11-25' date_start)
  4. sql (0.6ms) INSERT INTO "reservations" ("date_start","date_end","created_at","updated_at") VALUES ($1,$2,$3,$4) RETURNING "id" [["date_start","2017-11-25"],["date_end","2017-11-26"],["created_at","2017-11-21 13:23:05.192276"],["updated_at","2017-11-21 13:23:05.192276"]]
  5. (10.7ms) COMMIT
  6. => #
  7. irb(main):004:0> Reservation.create date_start: Date.parse('24-11-2017'),date_end: Date.parse('27-11-2017')
  8. (0.1ms) BEGIN
  9. (0.2ms) SELECT COUNT(*) FROM "reservations" WHERE ('2017-11-24' date_start)
  10. (0.2ms) ROLLBACK
  11. => #
  12. irb(main):005:0> Reservation.create date_start: Date.parse('25-11-2017'),date_end: Date.parse('26-11-2017')
  13. (0.1ms) BEGIN
  14. (0.3ms) SELECT COUNT(*) FROM "reservations" WHERE ('2017-11-25' date_start)
  15. (0.1ms) ROLLBACK
  16. => #

有预期的回滚.

猜你在找的Ruby相关文章