Je recherche une variante de la méthode #save
qui ne sauvegarde que les attributs auxquels aucune erreur n'est associée. Ainsi, un modèle peut être mis à jour sans être globalement valide, et cela permettra d'éviter l'enregistrement de données invalides dans la base de données.ActiveRecord # save_only_valid_attributes
Par « attributs valides », je veux dire les attributs qui donnent nul lors de l'appel @ model_instance.errors.on (: attribut)
Quelqu'un a une idée de comment y parvenir?
, j'ai Jusqu'à présent, les éléments suivants:
def save_valid_attributes
valid?
update_atrtibutes attributes.inject({}){|k, v, m| m[k] = v unless errors_on(k.to_sym); m}
end
Cela fonctionne s'il n'y a pas de traitement fait en mission, qui dans mon cas il y a. Par exemple, j'ai une colonne de base de données « date_début », et deux méthodes définies:
def nice_start_date=(startdate)
self.start_date = Chronic.parse(startdate) || startdate
end
def nice_start_date
self.start_date.to_s
end
Ces deux méthodes permettent de me analyser correctement l'utilisateur dates entrés à l'aide chronique avant d'enregistrer. Ainsi, la deuxième façon de le faire, un attribut à la fois:
def save_valid_attributes(attrib)
valid?
attrib.each{|(k,v)| send("${k}=", v); save; reload)
end
Le modèle doit être rechargé à chaque fois puisque, si l'une des dates est invalide et ne sauve pas, il empêchera tous les autres attributs de sauver.
Y a-t-il une meilleure façon de procéder? Je suis sûr que ce n'est pas un problème rare dans le monde de Rails, je n'arrive pas à trouver quelque chose dans l'univers de la connaissance de Google.