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

Rails db:如何绕过验证

  •  0
  • solidsnake99  · 技术社区  · 2 年前

    错误消息:

    rails aborted!
    ActiveRecord::RecordInvalid: Validation failed: Status : Event is Locked
    

    我在种子中存储了一堆测试数据。rb表示我在播种时遇到问题w/db:seed。

    预测结构

      {user_id: 2, event_id: 3, fighter_guess: "Jessica Andrade", method_guess: "Decision"},
      {user_id: 2, event_id: 3, fighter_guess: "Claudio Puelles", method_guess: "Submission"},
      {user_id: 2, event_id: 2, fighter_guess: "Vicente Luque", method_guess: "Decision"},
      {user_id: 2, event_id: 2, fighter_guess: "Caio Borralho", method_guess: "TKO/KO"},
      {user_id: 2, event_id: 1, fighter_guess: "Korean Zombie", method_guess: "TKO/KO"},
      {user_id: 2, event_id: 1, fighter_guess: "Petr Yan", method_guess: "Decision"},
      {user_id: 2, event_id: 4, fighter_guess: "Rob Font", method_guess: "Submission"},
      {user_id: 2, event_id: 5, fighter_guess: "Charles Oliveira", method_guess: "Decision"},
      {user_id: 2, event_id: 5, fighter_guess: "Rose Namajunas", method_guess: "Submission"},
      {user_id: 2, event_id: 6, fighter_guess: "Aleksandar Rakic", method_guess: "Decision"},
      ...
    
    

    我对预测模型进行了验证,在允许进行预测之前,该模型会检查相关事件的状态是否为“即将到来”。因此,当我运行db:seed时,它没有通过验证,因为有些事件不是“即将到来的”。

    事件结构

      {event_name: "UFC FN: LEMOS x ANDRADE", f1: "Amanda Lemos", f2: "Jessica Andrade", f3: "Clay Guida", f4: "Claudio Puelles", status: "Concluded", date: "Sat, Apr 23"},
      {event_name: "UFC FN: FONT x VERA", f1: "Rob Font", f2: "Marlon Vera", f3: "Andrei Arlovski", f4: "Jake Collier", status: "Concluded", date: "Sat, Apr 30"},
      {event_name: "UFC 274", f1: "Charles Oliveira", f2: "Justin Gaethje", f3: "Rose Namajunas", f4: "Carla Esparza", status: "Upcoming", date: "Sat, May 7"},
    

    预言rb

    class Prediction < ApplicationRecord
    
        belongs_to :event
        belongs_to :user
    
        validate :prediction_no_longer_allowed
    
    
    
        def prediction_no_longer_allowed
            if self.event.concluded? || self.event.in_progress?
                errors.add(:status, ": Event is Locked")
            end
        end
    end
    

    事件rb

    ...
        def concluded?
            self.status == "Concluded"
        end
    
        def in_progress?
            self.status == "In Progress"
        end 
    
    

    对于我想与其他人共享应用程序以测试功能的场景,如果我可以绕过验证以达到播种目的,这将节省大量时间。

    我按以下顺序播撒数据: 用户-->事件-->预言

    1 回复  |  直到 2 年前
        1
  •  1
  •   mechnicov    2 年前

    你可以用 insert_all 方法

    在一条SQL INSERT语句中向数据库中插入多条记录。它不会实例化任何模型,也不会触发活动记录回调或验证。虽然传递的值要经过活动记录的类型转换和序列化。

    Prediction.insert_all([
      {user_id: 2, event_id: 3, fighter_guess: "Jessica Andrade", method_guess: "Decision"},
      {user_id: 2, event_id: 3, fighter_guess: "Claudio Puelles", method_guess: "Submission"},
      {user_id: 2, event_id: 2, fighter_guess: "Vicente Luque", method_guess: "Decision"},
      {user_id: 2, event_id: 2, fighter_guess: "Caio Borralho", method_guess: "TKO/KO"},
      {user_id: 2, event_id: 1, fighter_guess: "Korean Zombie", method_guess: "TKO/KO"},
      {user_id: 2, event_id: 1, fighter_guess: "Petr Yan", method_guess: "Decision"},
      {user_id: 2, event_id: 4, fighter_guess: "Rob Font", method_guess: "Submission"},
      {user_id: 2, event_id: 5, fighter_guess: "Charles Oliveira", method_guess: "Decision"},
      {user_id: 2, event_id: 5, fighter_guess: "Rose Namajunas", method_guess: "Submission"},
      {user_id: 2, event_id: 6, fighter_guess: "Aleksandar Rakic", method_guess: "Decision"},
    ])
    

    也许最好先创建特定的事件和用户。然后打电话 user_id: my_super_user.id, event_id: my_super_event.id