ruby - 插入违反外键约束

标签 ruby postgresql

我的模型:

class Team < ApplicationRecord
    belongs_to :objective
    belongs_to :consultancy
    has_one :seminar, :through => :consultancy

    belongs_to  :consultant, class_name: "Student"

    has_and_belongs_to_many  :users
end

class User < ApplicationRecord
    has_and_belongs_to_many  :teams
end

我的功能:

def find_placement(student)
    team = @consultancy.teams.detect{|x| x.has_room && student.objective_students.find_by(:objective => x.objective).obj_ready_and_willing?}
    team.users << student if team && team.valid? && team.persisted?
    return team
end

这是我当前收到的错误:

PG::ForeignKeyViolation: ERROR: insert or update on table "teams_users" violates foreign key constraint "fk_rails_8299e376e9" DETAIL: Key (team_id)=(3396) is not present in table "teams". : INSERT INTO "teams_users" ("user_id", "team_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4)

该错误仅发生在生产环境中,开发或测试中不会发生。 我尝试使用控制台模式手动运行该函数的每一行。没有错误被触发。

来自这个问题https://dba.stackexchange.com/questions/29147/postgresql-insert-update-violates-foreign-key-constraints ,我找到了这个解释。

“如果插入新行,请检查 DataID 和 Address:如果它们包含非 NULL 值(例如 27856),则检查 Table1 中的 DataID˙ 和 Table2 中的 Address。如果在这些表,然后返回错误。”

如果我正确理解这一段,我的功能是尝试将学生插入一个不存在的团队。但是“if team && team.valid? && team.persisted”不是吗?我的代码的一部分负责处理这个问题吗?如果没有,将学生插入团队的更好方法是什么,但前提是该团队已经存在。

预先感谢您的任何见解。

最佳答案

valid? 方法不会检查数据库持久性,因此您可能需要也可能不需要它。您可能需要确保 team 模型持续存在并且不会从团队表中删除。为了安全起见,您可以检查两者。 ActiveRecord#persisted?方法:

def find_placement(student)
  if team = @consultancy.teams.detect{|x| x.has_room && student.objective_students.find_by(:objective => x.objective).obj_ready_and_willing?}
    team.users << student if team.valid? && team.persisted?
  end
  team
end

关于ruby - 插入违反外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56193030/

相关文章:

postgresql - 如何优化 PostgreSQL 中大表的 BETWEEN 条件

sql - Knex 原始查询不工作 postgresql

java - 如果表在 PostgreSQL 中被锁定,则 SELECT 查询失败

postgresql - 为 Postgres 连接向 Tomcat 提供证书

ruby-on-rails - Vim 7.3 中 Ruby OmniComplete 的问题在一行中找到匹配项,但在两行中找不到匹配项

mysql - SQL中的SHOW语句吗?

ruby-on-rails - Heroku rake 数据库 :migrate

ruby-on-rails - 编写一个带有身份验证的 Ruby/Rake 任务机器人来下载需要登录的数据

ruby-on-rails - MongoDB ruby 日期

ruby-on-rails - 解释 Rake 查询创建 csv