Как настроить доступность только для чтения на модели рельсов, используя атрибут в модели? - PullRequest
0 голосов
/ 26 ноября 2018

Как я могу установить модель только для чтения при каждом обращении к ней, если для атрибута в той же модели задано значение true?

Я посмотрел везде, и, кажется, что модель только для чтения имееточень мало документации и даже веб-результатов.

Редактировать (дополнительная информация): У меня есть два метода в моей модели (application.rb) - не конфиденциально

  def lock()
    self.locked = true
    save(validate: false)
  end

  def unlock()
    self.locked = false
    save(validate: false)
  end

Я вызываю их из моегоконтроллер приложений при обновлении с:

if params[:application][:locked] == false
  @application.unlock
  return
elsif params[:application][:locked] == true
  @application.lock
  return
end

и в модели (application.rb) у меня есть - не в частном порядке:

  def readonly?
    locked == true
  end

1 Ответ

0 голосов
/ 26 ноября 2018

Обновлено:

# 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;дайте мне знать.

...