由于外键约束,无法删除对象

时间:2015-04-09 17:03:20

标签: ruby-on-rails postgresql

尝试执行简单的user.destroy但遇到以下错误:

  

错误:表“用户”上的更新或删除违反表“身份”上的外键约束“fk_rails_5373344100”   DETAIL:Key(id)=(2)仍然从表“identity”中引用。

以下是我对身份的迁移

class CreateIdentities < ActiveRecord::Migration
  def change
    create_table :identities do |t|
      t.references :user, index: true, foreign_key: true
      t.string :provider
      t.string :uid

      t.timestamps null: false
    end
  end
end

这是我的用户和身份模型:

class Identity < ActiveRecord::Base
  belongs_to :user

  validates_presence_of :uid, :provider
  validates_uniqueness_of :uid, :scope => :provider

  def self.find_for_oauth(auth)
    find_or_create_by(uid: auth.uid, provider: auth.provider)
  end
end

和用户:

class User < ActiveRecord::Base
  TEMP_EMAIL_PREFIX = 'ricky@writeit.com'
  TEMP_EMAIL_REGEX = /\ricky@writeit.com/

  # Include default devise modules. Others available are:
  # :lockable, :timeoutable
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

  validates_format_of :email, :without => TEMP_EMAIL_REGEX, on: :update
...

end

我对外键和引用很新,所以我不确定如何解决这个问题。任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:48)

您需要首先删除引用该用户的标识。然后您可以删除用户..默认情况下,外键正在执行restrict,因此如果有任何引用该用户,您将无法删除该用户。

如果您想使用Rails处理破坏您可以做的身份

class User < ActiveRecord::Base
  has_many :identities,  dependent: :destroy 

  ......

 end 

哪会导致Rails破坏所有依赖记录。

但是当您使用外键时,您可以调整迁移以设置级联删除

 add_foreign_key :identities, :users, on_delete: :cascade

假设有本机支持的rails 4.2

答案 1 :(得分:2)

一个简单的解决方案是简单地级联删除关联表中的记录,这可以通过活动记录来完成,如下所示:

<强> user.rb

class User < ActiveRecord::Base
  has_many :identities, dependent: :destroy

  # rest of user class
end

查看documentation pertaining to has_many了解详情。