Не может удалить объект из-за ограничения внешнего ключа
Пытаясь сделать простой 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
Я новый для внешних ключей и ссылок, поэтому я не уверен, как это исправить. Любая помощь будет принята с благодарностью.
Спасибо
Ответы
Ответ 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
.