【问题标题】:Polymorphic | Self Referentials | Rails Active record models多态 |自我介绍 | Rails 活动记录模型
【发布时间】:2018-01-11 14:11:36
【问题描述】:

PG::ForeignKeyViolation:错误:更新或删除表“用户” 违反表上的外键约束“fk_rails_fd01e11a00” "user_tasks" DETAIL: Key (id)=(4) 仍然从表中引用 “用户任务”。 : DELETE FROM "users" WHERE "users"."id" = $1

一个用户可以将任务分配给另一个用户。在那里,我创建了一个连接任务表并自行连接用户表的直通表。表格如下所示:

|用户 ID |任务ID | to_user_id |

UserTask(迁移):

class CreateUserTasks  < ActiveRecord::Migration[5.0]
  def change
    create_table :user_tasks do |t|
      t.references :user, index: true, foreign_key: true
      t.references :task, foreign_key: true, unique: true
      t.references :to_user, index: true
      t.timestamps
    end
    add_foreign_key :user_tasks, :users, column: :to_user_id
    add_index :user_tasks, [:user_id, :to_user_id], unique: false
  end
end

型号如下:

用户

class User < ApplicationRecord
  has_many :user_tasks
  has_many :tasks, through: :user_tasks, dependent: :destroy
end

用户任务

class UserTask < ApplicationRecord
  belongs_to :user
  belongs_to :task
  belongs_to :to_user, class_name: "User"
end

任务

class Task < ApplicationRecord
    has_many :user_tasks
    has_many :users, through: :user_tasks, dependent: :destroy
    has_many :to_users, through: :user_tasks, dependent: :destroy
end

问题是当我尝试删除用户时,它会产生错误外键约束错误,该键仍然是来自用户表的引用 请帮助指导我在这里做错了什么。

【问题讨论】:

  • UserTask 是连接表吧?

标签: mysql ruby-on-rails postgresql activerecord


【解决方案1】:
class User < ApplicationRecord
 has_many :user_tasks, dependent: :destroy
 has_many :tasks, through: :user_tasks
end

我希望它有效???

交叉手指

【讨论】:

    【解决方案2】:

    我认为您的问题在于联接模型 UserTask。我认为它应该这样声明,没有下面的注释行。:

    UserTask:
    
    class UserTask < ApplicationRecord
      belongs_to :user
      belongs_to :task
      **#belongs_to :to_user, class_name: "User"**
    end
    

    然后您应该能够删除连接模型中的用户和记录,user_task,因为您已正确指定了依赖选项。 在此处查看详细说明:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html,删除或销毁部分?

    【讨论】:

      【解决方案3】:

      这是没有解决方案的答案:

      据我所知,在 google.com 上搜索后,我发现当使用 dependent: :destroy 关联时,它会查找对象 id 进行删除。

      但在我的情况下,我使用如下三重引用

      taskuserto_user 所以dependent: :destroy 将删除这些关联w.r.t 每个对象id,在我们的例子中为task_iduser_idto_user_id。它将只能删除taskuser,但不会删除to_user_id,因为它只知道user_id而不知道to_user_id

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        相关资源
        最近更新 更多