Подтвердить что ты не робот

Не может удалить объект из-за ограничения внешнего ключа

Пытаясь сделать простой user.destroy, но столкнувшись с следующей ошибкой:

ERROR: update or delete on table "users" violates foreign key constraint "fk_rails_5373344100" on table "identities" DETAIL: Key (id)=(2) is still referenced from table "identities".

Вот моя миграция для Identities

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 = '[email protected]'
  TEMP_EMAIL_REGEX = /\[email protected]/

  # 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

Я новый для внешних ключей и ссылок, поэтому я не уверен, как это исправить. Любая помощь будет принята с благодарностью.

Спасибо

4b9b3361

Ответ 1

Вам нужно будет удалить идентификатор, который сначала ссылается на пользователя. Затем вы можете удалить пользователя. По умолчанию внешний ключ выполняет restrict, поэтому вы не можете удалить пользователя, если что-то ссылается на него.

если вы хотите использовать Rails для обработки уничтожения идентификатора, который вы можете сделать

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

  ......

 end 

Это может привести к тому, что Rails уничтожит все зависимые записи.

Но поскольку вы используете внешние ключи, вы можете настроить миграцию для установки каскадных удалений

 add_foreign_key :identities, :users, on_delete: :cascade

Предполагая рельсы 4.2, которые имеют встроенную поддержку

Ответ 2

Простым решением является просто каскадное удаление записей в связанной таблице, что можно сделать с помощью активной записи, например:

user.rb

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

  # rest of user class
end

Подробнее см. документацию, относящуюся к has_many.