代码之家  ›  专栏  ›  技术社区  ›  codemilan

第一次插入后锁定ActiveRecord对象属性的最佳方法是什么?

  •  0
  • codemilan  · 技术社区  · 6 年前

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

    现在的问题是:

    1. 用户可以在创建/更新时放置任何属性数据。
    2. 假设创建时可锁定字段为空,
      i) 在第一次更新用户集时:没有。

      iii)在第3次更新时,用户集:出生地\国家/地区,但不能更改:社会\否&:出生日期。

    进一步说明,在第一次设置数据之后,无论是创建还是更新,一次还是任何更新操作,都需要锁定可锁定字段。

    我的解决方案是:

    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
    

    虽然这个解决方案是有效的,但我想这不是一个好方法,有没有其他方法可以最好地解决这个问题。非常感谢。

    0 回复  |  直到 6 年前
    推荐文章