J'ai une table de base de données avec un certain champ qui devrait être impossible à mettre à jour une fois qu'il a été inséré dans la base de données. Comment puis-je dire à mon modèle qu'il ne devrait pas permettre la mise à jour d'un certain champ?Comment créer un champ de base de données en lecture seule dans Rails?
Répondre
Vous voulez utiliser attr_readonly
:
attributs répertoriés en lecture seule seront utilisés pour créer un nouveau record, mais les opérations de mise à jour ignoreront ces champs.
class Customer < ActiveRecord::Base
attr_readonly :your_field_name
end
Ce champ est toujours et par définition « correcte » (à savoir une représentation exacte de la réalité) au moment de l'insertion?
Aucun utilisateur ne fait jamais une erreur lors de la saisie de ce champ pour la première fois (et dans votre schéma: seulement)?
En fait, l'utilisateur n'entre pas du tout, c'est réglé par le contrôleur. Ce que je veux empêcher, c'est que quelqu'un le modifie en utilisant une post-requête modifiée. – fresskoma
Dans ce cas, vous ne voulez pas du tout déranger avec des champs "readonly". Ce que vous voulez faire est d'utiliser l'instruction 'attr_protected' dans votre modèle pour éviter que le champ ne soit modifié par des mises à jour massives. Encore mieux: Utilisez 'attr_accessible' pour ne rendre disponibles que les champs sélectionnés pour les mises à jour de masse. – averell
Pour canaliser ici: Je pense que le cas d'utilisation approprié de attr_readonly est lorsque la modification de ce champ briserait l'intégrité de vos données. J'ai un champ: valid_at, et changer ce champ ne devrait jamais arriver, car cela signifierait que quelque chose ne va vraiment pas avec les algorithmes de base. Si cela arrive, tout est sur le pont. Toutes les données pourraient être mauvaises. Par conséquent, je ne devrais jamais avoir besoin de le changer, et préfèrerais éviter qu'il soit modifié par un bug dans un autre code. Si jamais on essaie de changer, je veux exploser très fort. – Houen
Ceci est la réponse correcte à votre question, mais la solution "correcte" à votre problème réel est un peu différente ... voir le commentaire sur l'autre question. – averell
Sinon, +1 à la réponse. – averell