Je peux voir un couple de différentes façons. Je pense le mieux serait d'ajouter un autre champ à la table appelée quelque chose comme lifecycle_id_original
. Ensuite, votre modèle comprendrait code comme ceci:
class Member < ActiveRecord::Base
belongs_to :lifecycle
validates :lifecycle_change_reason, :if => :lifecycle_changed?
before_save :reset_original_lifecycle
protected
def lifecycle_changed?
self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil?
end
def reset_original_lifecycle
self.lifecycle_id_original = self.lifecycle_id
end
end
Lorsque l'objet (membre dans cet exemple) est validée, lifecycle_change_reason ne seront requis que lorsque l'original et lifecycle_id ne sont pas identiques. Une valeur nulle est également autorisée pour l'original, car c'est ce que ce sera lors de la création d'un enregistrement.
Ensuite, quand il est sauvegardé, le "original" est réglé pour correspondre à lifecycle_id, de sorte que le prochain cycle de mise à jour fonctionnera correctement.
Ce n'est pas aussi propre que je le voudrais. Ma première pensée a été d'utiliser un attr_accessor
afin que le doublon ne soit pas stocké dans le DB tout le temps, mais cela aurait signifié de définir cette valeur chaque fois qu'un enregistrement est chargé. Je ne connais aucun rappel de style on_load pour les modèles ActiveRecord.
le problème avec ceci est que vous n'obtenez pas toute la gestion des erreurs de validation agréable dans la forme. –
Sûrement vous savez comment faire cela aussi: @ object.errors.add (: life_cycle_change_reason, "doit être fourni.") Simple. – adriandz