through rails many how has_and_belongs_to_many has foreign example create belongs and active ruby-on-rails ruby-on-rails-4 has-many-through polymorphic-associations

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