2011-03-25 1 views
0

Rails 2.3.5, Rubis 1.8.7.Rails emboîtés avec condition d'unicité

J'ai trois modèles, Person, AcademicTerm et PersonTermStatus.

class PersonTermStatus { 
    belongs_to :academic_term 
    belongs_to :person 
    validates_uniquness_of :academic_term_id, :scope => :person_id 
    @ ... 
} 

class Person { 
    has_many :person_term_statuses 
} 

Dans une forme imbriquée dynamique pour un enregistrement de personne, j'autorise l'édition des person_term_statuses. Mais j'obtiens des erreurs de validation si l'utilisateur effectue l'une des actions suivantes:

  1. Supprime un statut et en crée un nouveau avec le même terme académique dans la même modification.
  2. Échange les termes académiques entre deux statuts existants.

Je comprends pourquoi cela se produit. Dans (1), l'état marqué pour la suppression n'est pas réellement supprimé avant la validation de la condition d'unicité du nouveau statut. Dans (2), la condition d'unicité est à nouveau appliquée avant tout changement, et elle trouve un autre enregistrement avec le même academic_term.

Le problème est, je ne peux pas trouver un moyen de contourner cela. Y a-t-il une solution connue?

(Ma imbriqué forme implmenetation est d'utiliser currrently à peu près la technique exactement de Railscast [Part I et Part II)

Répondre

0

Il n'y a pas de solution à ce que je sache. Toutefois, vous pouvez ajouter des clés étrangères à votre base de données pour appliquer l'unicité du côté de la base de données, puis utiliser l'approche suivante.

Ajoutez une before_validation au modèle parent qui supprime et recrée en tant que nouveaux enregistrements tous les enfants. Ajoutez ensuite une fonction de validation personnalisée qui vérifie manuellement l'unicité des enregistrements enfants en fonction de ce qui se trouve dans la mémoire (plutôt que dans la base de données).

Les inconvénients de cette approche comprennent:

  • Les enfants ne conservent pas les mêmes identifiants.
  • Les changements d'horodatage créés.