首页 > 解决方案 > Rails:关联计数的条件验证(仅在创建新关联时)

问题描述

我们有一个place与 has_many 关系的模型place_attachements。place_attachments 的最大计数应根据place_attachments_limit位置模型中设置的动态值进行验证。

基本上,这可以通过简单的验证来完成,但在我们的例子中,我们希望有一个例外:附件计数的验证应该只适用于 place_attachments 上的更新和创建操作,而不是删除操作。

对此的解释是,如果place_attachements_limit已减少,我们希望保留所有位置附件(即使超出限制)但不允许创建新附件,除非总数再次低于限制。

场所附件通过场所模型的嵌套形式创建和销毁。

既然我们无法在自定义验证中获得任何有关先前关联计数的信息,我们该如何做到这一点?

      class RespectQuotaValidator < ActiveModel::EachValidator
        attr_reader :record

        def initialize(options)
          super
        end

        # CAN WE SKIP THE FOLLOWING IN CASE OF PLACE ATTACHMENT DELETIONS?

        def validate_each(record, attribute, value)
          @record = record

          if !value.nil? && !record.map.nil?
            unless value_length <= record.place_attachments_limit
              record.errors.add(:base, I18n.t('errors.max_associations_per_place_exceeded'))
            end
          end
        end
      end

标签: ruby-on-railsvalidationassociations

解决方案


推荐阅读