Rails DB:种子如何绕过验证

发布于 2025-01-25 15:49:51 字数 2298 浏览 0 评论 0原文

错误消息:

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

我在种子中存储了一堆测试数据。

预测结构

  {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"},
  ...

I对预测模型有验证,该模型在允许进行预测之前检查所讨论的事件_id的状态是“即将到来的”。因此,当我运行DB:种子时,它会失败验证,因为某些事件不是“即将到来的”。

事件结构

  {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

Event.RB

...
    def concluded?
        self.status == "Concluded"
    end

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

对于我想与其他人共享该应用以测试功能的情况,如果我可以绕过验证验证以进行播种目的,则可以节省很多时间。

我正在按以下顺序进行播种数据 用户 - &gt;活动 - &GT;预言

Error Message:

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

I stored a bunch of test data in seeds.rb that I am having trouble seeding w/ db:seed.

Prediction structure

  {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"},
  ...

I have a validation for the Prediction model that checks for the status of the event_id in question to be "Upcoming", before allowing the prediction to be made. So when I run db:seed, it fails the validation because some of the events are not "Upcoming".

Event structure

  {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"},

Prediction.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

Event.rb

...
    def concluded?
        self.status == "Concluded"
    end

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

For my scenario of wanting to share the app with others to test functionality, it would save a lot of time if I could bypass validations for seeding purposes.

I am seeding data in order of:
User --> Event --> Prediction

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失与倦" 2025-02-01 15:49:51

您可以使用方法

在单个SQL插入语句中将多个记录插入数据库中。它不会实例化任何模型,也不会触发主动记录回调或验证。尽管传递的值通过Active Record的类型铸造和序列化。

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等。

You can use insert_all method

Inserts multiple records into the database in a single SQL INSERT statement. It does not instantiate any models nor does it trigger Active Record callbacks or validations. Though passed values go through Active Record's type casting and serialization.

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"},
])

May be it's better to create first specific events and users. And then call user_id: my_super_user.id, event_id: my_super_event.id etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文