【问题标题】:How to validate range dates with rails 6如何使用 rails 6 验证范围日期
【发布时间】:2022-10-14 23:02:43
【问题描述】:

你好,我有一个帖子模块,用户可以在其中选择发布他的帖子的日期,我有 2 个字段

start_date:date and expiration_date:date 

我想做这样的验证

如果用户选择 start_date = 2022-10-14 和 expiration_date = 2022-10-22,他不能创建另一个介于该范围之间的帖子。

因为我一次只能发布 1 个帖子,所以通过此验证,我将强制用户选择不在此选定范围日期之间的任何其他日期。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-6 ruby-on-rails-6.1


    【解决方案1】:

    只需检查是否没有其他帖子在到期日期之前开始并在开始日期之后结束。如果您要更新现有帖子,请在支票中排除此帖子的 ID。 (帖子不应该阻止自己改变)。

    这将捕获与当前帖子完全或部分重叠的帖子,或者在当前帖子中开始和结束的帖子。

    validates :date_range
    
    def date_range
      if user.posts.where.not(id: id).where('start_date < ? AND expriration_date > ?', expiration_date, start_date).any?
        errors.add(:start_date, 'there is already a post that overlaps these dates')
      end
    end
    

    【讨论】:

      【解决方案2】:

      在您的Post 模型中,您需要进行一些验证。

      您可以创建一个自定义方法,该方法将检查您尝试创建的帖子是否在任何当前帖子之间具有开始日期。

      class Post < ApplicationRecord
        
        validate :post_exists? on: :create
      
      
        private
      
        def post_exists?
          return unless Post.where("? BETWEEN start_date AND expiration_date", self.start_date).present?
        
          errors.add(:start_date, "Post already exists")
        end
      
      end
      

      我目前无法对此进行测试,但大致是您需要的。

      关于主题的一些简单阅读〜
      自定义验证方法:https://guides.rubyonrails.org/active_record_validations.html#custom-methods
      验证某些操作,即on: :create:在这种情况下。 https://guides.rubyonrails.org/active_record_validations.html#on

      值得一提的是,堆栈上还有一些非常相似的其他问题,值得一试。 Rails ActiveRecord date between

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-03
        • 1970-01-01
        • 2019-06-09
        • 2016-03-15
        相关资源
        最近更新 更多