2.7.2 :004 > Author.find(1).delete Author Load (0.2ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = ? LÍMITE ? [["id", 1], ["LIMIT", 1]] Autor Destroy (1.0ms) DELETE FROM "authors" WHERE "authors"."id" = ? [["id", 1]] Rastreo (última llamada más reciente): ActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: restricción FOREIGN KEY falló: DELETE FROM "authors" WHERE "authors"."id" = ?)
Esta es la excepción que obtengo cuando realizo la eliminación.
Mi modelo de autor parece, también se usa anular
class Author < ApplicationRecord has_many :books, dependent: :destroy end
El modelo de mi libro se ve así
class Book < ApplicationRecord belongs_to :author end
Puedo destruir al autor y el registro se elimina y también destruir los libros contra esa identificación de autor, ahora solo quiero eliminar al autor y quiero que los libros permanezcan allí o se anulen, pero arroja una excepción cuando lo elimino
Esquema
create_table 'authors', force: :cascade do |t| t.string 'name' t.integer 'age' t.datetime 'created_at', null: false t.datetime 'updated_at', null: false end create_table 'books', force: :cascade do |t| t.string 'name' t.integer 'price' t.integer 'author_id' t.datetime 'created_at', null: false t.datetime 'updated_at', null: false t.index ['author_id'], name: 'index_books_on_author_id'
ActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: la restricción FOREIGN KEY falló: DELETE FROM "authors" WHERE "authors"."id" = ?)
Si desea poder anular author_id, debe crear una migración para eliminar la clave externa y ejecutarla:
class RemoveAuthorForeignKeyFromBooks < ActiveRecord::Migration[6.0] def change remove_foreign_key :books, :authors end end
remove_foreign_key
no funcionaba correctamente en SQLite antes de Rails 6 , por lo que es posible que necesite una solución en versiones anteriores.
class Book < ApplicationRecord belongs_to :author, optional: true end class Author < ApplicationRecord has_many :books, dependent: :nullify end
Si no hace la opción de relación pertenece_a entonces no podrá actualizar el libro después de anular el id_autor.