J'ai un objet de modèle ActiveCord Je veux pouvoir afficher des versions modifiées des instances de cet objet. Je voudrais réutiliser la classe elle-même, car elle a déjà tous les crochets et les aspects dont je vais avoir besoin. (Par exemple: j'ai déjà une vue qui affiche les attributs appropriés). Fondamentalement, je veux cloner l'instance de modèle, modifier certaines de ses propriétés et le retourner à l'appelant (vue, test, etc.). P>
Je fais pas em> que ces modifications d'attribut se rentrent dans la base de données. Cependant, je souhaite inclure l'attribut Alors, je cherche à verrouiller la nouvelle instance afin de ne rien faire d'autre. Je vous envisagine déjà d'appeler Quelle serait la meilleure approche pour atteindre cela? p> foo code>; Il représente une ligne de base de données standard. P>
ID code> dans la version clonée, car cela facilite la gestion des aides d'itinéraire. Ainsi, je planifie l'appelant
activerecord :: base.clone () code>, définissant manuellement l'ID de l'instance clonée, puis apporte l'attribut approprié à la nouvelle instance. Cela m'a inquiété cependant; Un
sauvegardez () code> sur l'instance modifiée et mes données d'origine seront classées. p>
gel () code> (sur la compréhension que cela empêche la modification supplémentaire de l'objet, bien que le La documentation n'est pas terriblement claire ). Cependant, je ne vois aucune façon évidente d'empêcher une sauvegarde (). P>
3 Réponses :
Il pourrait y avoir un moyen plus idiomatique de le faire, mais une solution serait de définir un attribut virtuel et de le vérifier dans un avant_save code> rappel. Lorsque vous clonez l'objet, définissez l'attribut virtuel - peut-être quelque chose comme
is_clone code> à
true code>. Définissez ensuite un
avant_save code> rappel de votre classe de modèle qui empêche l'enregistrement si cet attribut est défini. P>
gel () code> semble atteindre ce que je veux, bien que de manière laid.
x = Factory.create(:my_model)
x.save! # true
x.freeze
x.save!
TypeError: can't modify frozen hash
Juste pour clarifier, Freeze empêchera que l'instance soit modifiée du tout, tandis que Readonly! permettra des modifications mais empêchera l'instance modifiée étant enregistrée dans la base de données.
Merci pour la mise à jour @davidaldridge; J'ai changé ma réponse acceptée.
Vous pouvez utiliser activeRecord :: base # lisible !
model = MyModel.find 1 model.readonly! model.save!
Si vous avez besoin de gâcher cela de manière significative avec l'objet Standard Activerecord, il existe probablement un meilleur moyen d'aborder le problème.
Je suis certainement ouvert aux alternatives