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