Каков наилучший способ блокировки атрибутов объекта ActiveRecord после первой вставки? - PullRequest
0 голосов
/ 30 апреля 2020

Модель пользователя имеет следующие атрибуты:

:first_name, :last_name # these shouldn't be locked.
:social_no, :dob, :birth_country # these should be locked.

Теперь проблема заключается в следующем:

  1. Пользователь может поместить любые данные attr при создании / обновлении.
  2. После первой вставки / создания / обновления для последних трех блокируемых полей: social_no,: dob &: birth_country должны быть заблокированы, чтобы пользователь не мог обновить их только администратор.
  3. Сказать, что блокируется поля при создании пустые, теперь
    i) при первом наборе пользователя обновления: social_no.
    ii) при втором наборе обновления пользователя: dob, но не должно быть в состоянии изменить: social_no, поскольку оно уже установлено.
    iii) при 3-м обновлении пользователь установил: birth_country, но не должен иметь возможность изменить: social_no &: dob.

Более подробно, блокируемые поля должны быть заблокированы после того, как данные были установлены впервые, независимо от того, были ли они созданы или обновлены, сразу или при любом действии обновления.

Мое решение:

class User < ApplicationRecord
  attr_accessor :editable_by_admin

  validate :validate_locked_attrs_not_editable, on: :update, unless: :editable_by_admin?

  def editable_by_admin?
    self.editable_by_admin == true
  end

  def validate_locked_attrs_not_editable
    old_record = User.find(id)
    User.locked_attrs.each do |attr|
      unless old_record.send(attr).blank?
        if old_record.send(attr) != self.send(attr)
          self.errors.add(attr, "can't be edited.")
        end
      end
    end
  end

  def self.locked_attrs
    %i[
      first_name
      last_name
      dob
      birt_country
    ].freeze
  end
end

Хотя решение работает, я думаю, что это не очень хороший подход. Есть ли другой способ решить проблему наилучшим образом. Спасибо.

...