[RUBY] Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly

Ce qui est fourni dans ActiveRecord n'affecte que certains comportements Je m'inquiète des fuites, mais je vais devoir faire de mon mieux pour fabriquer un module pour le sceller.

Placez-le autour de lib / autoload / active_record_read_only.rb

module ActiveRecordReadOnly
  extend ActiveSupport::Concern

  # ActiveRecord::Doit être annulé avec une erreur ReadOnlyRecord
  #Il n'est pas nécessaire de le déplacer en vain, alors scellez-le
  included do
    before_save { self.class.raise_readonly! }
    before_create { self.class.raise_readonly! }
    before_update { self.class.raise_readonly! }
    before_destroy { self.class.raise_readonly! }
  end

  #Contrôle ReadOnly de base
  def readonly?
    true
  end

  #Seal touch
  #Ce n'est pas suffisant pour les raisons suivantes, mais il est écrasé pour faire correspondre la fonction de jugement avec le comportement réel.
  def no_touching?
    true
  end

  #Seal touch
  # no_touching?Si vous le scellez simplement avec, cela ne causera pas d'erreur, alors scellez-le directement
  def touch
    self.class.raise_readonly!
  end

  module ClassMethods
    # update_colonne et mise à jour_colonnes, etc. en lecture seule?Bloquer le traitement des spécifications de colonne sans jugement
    def readonly_attributes
      attribute_names
    end

    # readonly?Puisqu'il s'agit d'un processus unique sans jugement, il est scellé directement
    def delete(_id)
      raise_readonly!
    end

    #Puisqu'il s'agit d'une opération par lots et qu'aucune colonne n'est spécifiée, elle est scellée directement.
    def delete_all
      raise_readonly!
    end

    #Puisqu'il s'agit d'une opération par lots et qu'aucune colonne n'est spécifiée, elle est scellée directement.
    def update_all(_attributes)
      raise_readonly!
    end

    def raise_readonly!
      raise ActiveRecord::ReadOnlyRecord,
            "#{name}.included ActiveRecordReadOnly"
    end
  end
end

Incluez simplement

class User < ApplicationRecord
  include ActiveRecordReadOnly
end

Peut être bloqué

[1] pry(main)> ActiveRecord::Base.logger = nil
=> nil
[2] pry(main)> User.first.destroy
ActiveRecord::ReadOnlyRecord: User.included ActiveRecordReadOnly
from /app/lib/autoload/active_record_read_only.rb:52:in `raise_readonly!'
[3] pry(main)> User.first.update(code: 'test')
ActiveRecord::ReadOnlyRecord: User.included ActiveRecordReadOnly
from /app/lib/autoload/active_record_read_only.rb:52:in `raise_readonly!'
[4] pry(main)> User.first.update_columns(code: 'test')
ActiveRecord::ActiveRecordError: code is marked as readonly
from /usr/local/bundle/gems/activerecord-6.0.0/lib/active_record/persistence.rb:947:in `verify_readonly_attribute'
[5] pry(main)> User.first.update_column(:code, 'test')
ActiveRecord::ActiveRecordError: code is marked as readonly
from /usr/local/bundle/gems/activerecord-6.0.0/lib/active_record/persistence.rb:947:in `verify_readonly_attribute'
[6] pry(main)> User.first.touch
ActiveRecord::ReadOnlyRecord: User.included ActiveRecordReadOnly
from /app/lib/autoload/active_record_read_only.rb:52:in `raise_readonly!'
[7] pry(main)> User.create(code: 'test')
ActiveRecord::ReadOnlyRecord: User.included ActiveRecordReadOnly
from /app/lib/autoload/active_record_read_only.rb:52:in `raise_readonly!'
[8] pry(main)> User.delete(1)
ActiveRecord::ReadOnlyRecord: User.included ActiveRecordReadOnly
from /app/lib/autoload/active_record_read_only.rb:52:in `raise_readonly!'
[9] pry(main)> User.delete_all
ActiveRecord::ReadOnlyRecord: User.included ActiveRecordReadOnly
from /app/lib/autoload/active_record_read_only.rb:52:in `raise_readonly!'
[10] pry(main)> User.update_all(code: 'test')
ActiveRecord::ReadOnlyRecord: User.included ActiveRecordReadOnly
from /app/lib/autoload/active_record_read_only.rb:52:in `raise_readonly!'

[Supplément supplémentaire] Intention de bloquer le rappel

Lorsqu'il était appliqué au corps du modèle, il n'avait pas de sens car il peut être défini après le blocage Il est supposé qu'il sera séparé dans le modèle d'héritage pour être visualisé comme indiqué ci-dessous.

class User < ApplicationRecord
  before_create -> { }
end

class ReadOnlyUser < User
  include ActiveRecordReadOnly
end

Recommended Posts

Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
Je veux appeler une méthode d'une autre classe
Je souhaite surveiller un fichier spécifique avec WatchService
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
J'ai essayé de créer une fonction de message de l'extension Rails Tutorial (Partie 1): Créer un modèle
J'ai créé un client RESAS-API en Java
Je souhaite rechercher de manière récursive des fichiers dans un répertoire spécifique
Je veux créer un bouton avec un saut de ligne avec link_to [Note]
Je souhaite développer une application web!
Je veux écrire un joli build.gradle
Je veux créer une application ios.android
Je veux écrire un test unitaire!
[Controller] Je veux récupérer la valeur numérique d'une colonne spécifique de la base de données (mon mémo)
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
Faire une marge à gauche du TextField
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Définir l'heure de LocalDateTime à une heure spécifique
[Ruby] Je veux faire un saut de méthode!
Je veux var_dump le contenu de l'intention
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Je veux écrire une simple répétition d'une chaîne de caractères
Je souhaite concevoir une structure pour la gestion des exceptions
[Android] Je veux faciliter le contrôle qualité ... C'est vrai! Faisons un menu de débogage!
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
J'étais accro au record du modèle associé
Je veux utiliser une petite icône dans Rails
Comment faire fonctionner JavaScript sur une page spécifique
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je souhaite appliquer ContainerRelativeShape uniquement à des coins spécifiques [SwiftUI]
J'ai essayé de créer une fonction de connexion avec Java
Je souhaite définir une fonction dans la console Rails
Je veux cliquer sur une broche GoogleMap dans RSpec
[IOS] Pour autoriser la rotation d'un écran spécifique uniquement
Je veux retourner la position de défilement de UITableView!
Je souhaite créer une annotation générique pour un type
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
[Java] Je souhaite convertir un tableau d'octets en un nombre hexadécimal
Je veux trouver un chemin relatif dans une situation où Path est utilisé
J'ai essayé de faire une fonction de réponse de l'extension Rails Tutorial (Partie 3): Correction d'un malentendu des spécifications
Je veux convertir des caractères ...
Je souhaite implémenter une fonction d'édition des informations produit ~ part1 ~
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
J'ai essayé de convertir l'exemple d'application en microservice selon l'idée du livre "Microservice Architecture".
Je veux appeler une méthode et compter le nombre
Je voulais juste créer une propriété réactive en Java
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]