9
votes

Empêcher ActionCord Save () sur une instance

J'ai un objet de modèle ActiveCord foo ; Il représente une ligne de base de données standard.

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.).

Je fais pas que ces modifications d'attribut se rentrent dans la base de données. Cependant, je souhaite inclure l'attribut ID dans la version clonée, car cela facilite la gestion des aides d'itinéraire. Ainsi, je planifie l'appelant activerecord :: base.clone () , 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 () sur l'instance modifiée et mes données d'origine seront classées.

Alors, je cherche à verrouiller la nouvelle instance afin de ne rien faire d'autre. Je vous envisagine déjà d'appeler gel () (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 ().

Quelle serait la meilleure approche pour atteindre cela?


2 commentaires

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


3 Réponses :


4
votes

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 rappel. Lorsque vous clonez l'objet, définissez l'attribut virtuel - peut-être quelque chose comme is_clone à true . Définissez ensuite un avant_save rappel de votre classe de modèle qui empêche l'enregistrement si cet attribut est défini.


0 commentaires

4
votes

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


2 commentaires

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.



23
votes

Vous pouvez utiliser activeRecord :: base # lisible !

model = MyModel.find 1
model.readonly!
model.save!


0 commentaires