ruby-on-rails - many - rails foreign key
Después de actualizar a Rails 4.1, las nuevas asociaciones polimórficas no son válidas al guardarlas junto con sus padres (2)
Después de actualizar de Rails 3.2 a 4.1, el siguiente código que solía funcionar ahora está fallando:
en un controlador / especificación:
post = user.posts.build
post.contacts << contact # contact is a persisted record
post.save! # now fails
Básicamente estoy tratando de guardar la publicación junto con su contacto asociado, que se supone que crea un registro contact_publishment
sobre la marcha. El error está en el nuevo registro contact_publishment
: "Publishable no puede estar en blanco"
el modelo:
class Contact
...
has_many :contact_publishments
...
end
class ContactPublishment
...
belongs_to :publishable, polymorphic: true
belongs_to :contact
validates_uniqueness_of :publishable_id, :scope => [:contact_id, :publishable_type]
validates_presence_of :contact, :publishable
...
end
class Post
...
has_many :contact_publishments, as: :publishable
has_many :contacts, through: :contact_publishments
...
end
Creo que la asociación no se está actualizando porque no tiene la configuración inverse_of
entre contacto y contact_publishment.
De los documentos sobre la configuración de un: a través de
Si va a modificar la asociación (en lugar de simplemente leer de ella), entonces es una buena idea establecer la opción: inverse_of en la asociación de origen en el modelo de unión. Esto permite crear registros asociados que crearán automáticamente los registros de modelos de combinación apropiados cuando se guarden.
En Rails 3.2, el modelo de propietario se ha guardado antes de realizar la asociación anidada de validación, en la validación 4.1 antes de guardar el modelo y porque no se guardó la publicación, validación
class ContactPublishment
validates_presence_of :publishable
no permite pasar la validación (publicación no guardada en db)
Para resolver esto, puede deshabilitar la validación en el modelo de publicación, (se ha llamado a la validación en ContactPublishment desde el modelo de contacto)
class Post < ActiveRecord::Base
has_many :contact_publishments, as: :publishable, validate: false
o reemplace la validación de presencia de esta manera:
class ContactPublishment < ActiveRecord::Base
validates_associated :publishable
change_column :contact_publishments, :publishable_type, :string, null: false
change_column :contact_publishments, :publishable_id, :integer, null: false
o hacerlo a través de proxy_association