[RUBY] Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen

Was in ActiveRecord bereitgestellt wird, wirkt sich nur auf einige Verhaltensweisen aus Ich mache mir Sorgen um Lecks, aber ich muss mein Bestes geben, um ein Modul zu erstellen, um es abzudichten.

Platziere es um lib / autoload / active_record_read_only.rb

module ActiveRecordReadOnly
  extend ActiveSupport::Concern

  # ActiveRecord::Sollte mit einem ReadOnlyRecord-Fehler zurückgesetzt werden
  #Es ist nicht notwendig, es umsonst zu bewegen, also versiegeln Sie es
  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

  #Grundlegende ReadOnly-Steuerung
  def readonly?
    true
  end

  #Siegelberührung
  #Dies reicht aus den folgenden Gründen nicht aus, wird jedoch überschrieben, um die Beurteilungsfunktion mit dem tatsächlichen Verhalten abzugleichen.
  def no_touching?
    true
  end

  #Siegelberührung
  # no_touching?Wenn Sie es nur mit versiegeln, wird es keinen Fehler verursachen, also versiegeln Sie es direkt
  def touch
    self.class.raise_readonly!
  end

  module ClassMethods
    # update_Spalte und Update_Spalten usw. schreibgeschützt?Blockspaltenspezifikationsverarbeitung ohne Beurteilung
    def readonly_attributes
      attribute_names
    end

    # readonly?Da es sich um einen einzelnen Prozess ohne Urteil handelt, wird er direkt versiegelt
    def delete(_id)
      raise_readonly!
    end

    #Da es sich um eine Chargenoperation handelt und keine Säule angegeben ist, wird sie direkt versiegelt.
    def delete_all
      raise_readonly!
    end

    #Da es sich um eine Chargenoperation handelt und keine Säule angegeben ist, wird sie direkt versiegelt.
    def update_all(_attributes)
      raise_readonly!
    end

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

Einfach einschließen

class User < ApplicationRecord
  include ActiveRecordReadOnly
end

Kann blockiert werden

[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!'

[Zusätzliche Ergänzung] Absicht, den Rückruf zu blockieren

Bei der Anwendung auf den Modellkörper war dies bedeutungslos, da er nach der Blockierung definiert werden kann Es wird davon ausgegangen, dass es zur Anzeige wie unten gezeigt in das Vererbungsmodell aufgeteilt wird.

class User < ApplicationRecord
  before_create -> { }
end

class ReadOnlyUser < User
  include ActiveRecordReadOnly
end

Recommended Posts

Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich möchte eine Methode einer anderen Klasse aufrufen
Ich möchte eine bestimmte Datei mit WatchService überwachen
Rails6 Ich möchte ein Array von Werten mit einem Kontrollkästchen erstellen
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich habe versucht, eine Nachrichtenfunktion der Rails Tutorial-Erweiterung (Teil 1) zu erstellen: Erstellen Sie ein Modell
Ich habe einen RESAS-API-Client in Java erstellt
Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen
Ich möchte mit link_to [Hinweis] eine Schaltfläche mit einem Zeilenumbruch erstellen.
Ich möchte eine Webanwendung entwickeln!
Ich möchte ein schönes build.gradle schreiben
Ich möchte eine ios.android App machen
Ich möchte einen Unit Test schreiben!
[Controller] Ich möchte den numerischen Wert einer bestimmten Spalte aus der Datenbank abrufen (mein Memo).
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden
Machen Sie einen Rand links vom TextField
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Stellen Sie die Zeit von LocalDateTime auf eine bestimmte Zeit ein
[Ruby] Ich möchte einen Methodensprung machen!
Ich möchte den Inhalt der Absicht var_dump
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich möchte eine einfache Wiederholung einer Zeichenkette schreiben
Ich möchte eine Struktur für die Ausnahmebehandlung entwerfen
[Android] Ich möchte die Qualitätssicherung vereinfachen ... Das stimmt! Lassen Sie uns ein Debug-Menü erstellen!
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Ich möchte ein kleines Symbol in Rails verwenden
So funktioniert JavaScript auf einer bestimmten Seite
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte ContainerRelativeShape nur auf bestimmte Ecken anwenden [SwiftUI]
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich möchte eine Funktion in der Rails Console definieren
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
[IOS] Zum Drehen nur eines bestimmten Bildschirms
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte eine generische Anmerkung für einen Typ erstellen
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
[Java] Ich möchte ein Byte-Array in eine Hexadezimalzahl konvertieren
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Ich habe versucht, eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 3) zu erstellen: Ein Missverständnis der Spezifikationen wurde behoben
Ich möchte Zeichen konvertieren ...
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen