Обновлено:
# app/models/application.rb
# I highly suggest renaming `Application` into something else because, Rails
# already has a same defined constant name `Application` which is defined in your
# app/config/application.rb
class Application < ApplicationRecord
def lock!
# depending on your use-case I'll do an `update` below instead
# self.lock = true
update!(locked: true)
end
def unlock!
# self.lock = false
update!(locked: false)
end
end
# app/models/user.rb
class User < ApplicationRecord
belongs_to :application
def readonly?
# this is still subject to race-condition even though already `reloaded`
application.reload.locked || some_user_attribute == 'HELLO WORLD!'
end
end
# app/models/comment.rb
class Comment < ApplicationRecord
belongs_to :application
def readonly?
# this is still subject to race-condition even though already `reloaded`
application.reload.locked || some_comment_attribute_like_is_disabled?
end
end
Обратите внимание, что я добавил ассоциацию belongs_to
, потому что она вам, скорее всего, понадобится, потому что ваша Application
, как вы сказали, на самом деле уже является нормальной моделью в любом случае,Если у вас нет этой ассоциации, и вы устанавливаете locked
внутри себя как переменную экземпляра класса вашего Application
класса (т. Е. У вас есть @locked
переменная экземпляра класса), то (в зависимости от ваших требований) вы будетевозникают проблемы с 1) постоянством, потому что каждый запрос (для каждого процесса / сервера) по умолчанию будет locked = nil
(что может или не может быть проблемой для вас), а также 2) параллелизм, потому что потоки разделяют значение этой переменной экземпляра класса, что означает, что для одновременных запросов это значение @locked
должно оцениваться независимо;который становится потенциально опасным, если для @locked
установлено значение true
в одном потоке, а в другом - @locked
переопределено и установлено на false
.Но если это не проблема, я все равно могу обновить свой ответ, чтобы не использовать belongs_to :application
;дайте мне знать.