type remove references rails generate foreign delete data column change ruby-on-rails ruby ruby-on-rails-4 rails-activerecord ruby-on-rails-4.2

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''