ruby on rails - remove - Agregar clave externa anulable en Rails
remove foreign key rails (3)
Haciendo referencia al soporte de Rails 4.2 add_foreign_key :
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
¿Cómo crear una restricción de clave foránea anulable, para permitir la situación, donde articles.author_id
a veces puede ser nulo?
La adición de optional: true
junto con belongs_to :author
en el modelo de article
hará el trabajo.
No hay nada en la guía que implique que add_foreign_key
haga que el campo externo correspondiente sea "NOT NULL" o requerido. add_foreign_key
simplemente agrega una restricción de clave foránea si el campo es obligatorio o no (en su caso, author_id
en los articles
).
¿Recibió un error al intentar esto en su migración?
Aquí está el SQL que generaría:
ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
Entonces, si en su migración original de articles
, author_id
es nulo, entonces puede tener una clave externa que es anulable.
Tenga en cuenta que en Rails 5 puede que tenga que marcar la asociación correspondiente como opcional si es 1: n ( belongs_to
), ya que se cambió el valor predeterminado:
belongs_to :author, optional: true
Este es el Changeset correspondiente.
Para utilizar el comportamiento anterior en su aplicación, también puede configurar:
Rails.application.config.active_record.belongs_to_required_by_default = false
en config/initializers/new_framework_defaults.rb
El error que normalmente verás es:
ActiveRecord::RecordInvalid: Validation failed: Author must exist
from /usr/local/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/validations.rb:78:in `raise_validation_error''