Sha256: 8779a209ff24da5d9113693294c1f9bcabf5de3d056c51080192a6e28517dc56
Contents?: true
Size: 1.87 KB
Versions: 2
Compression:
Stored size: 1.87 KB
Contents
# frozen_string_literal: true module SolidusActAsTenant # TenantAware automatically adds multi-tenant support to models # by adding tenant scoping and updating uniqueness validations to be tenant-aware. module TenantAware class << self def setup_tenant_aware_models tenant_aware_models = SolidusActAsTenant.config.tenant_aware_models || [] tenant_aware_models.each do |klass, validator_attributes| Module.new do @validator_attributes = validator_attributes define_singleton_method(:prepended) do |base| options = ::SolidusActAsTenant.config.acts_as_tenant_args base.acts_as_tenant(*options[0..-2], **options.last) @validator_attributes&.each do |attribute| TenantAware.update_uniqueness_validation(base, attribute) end end klass.constantize.prepend(self) end end end def update_uniqueness_validation(base, attribute) attribute = attribute.to_sym validator = base._validators[attribute].find { _1.kind == :uniqueness } raise "No uniqueness validator found for #{attribute} on #{base}" unless validator new_options = validator.options.dup new_options[:scope] = Array(new_options[:scope]).push(::SolidusActAsTenant.config.tenant_column_name) remove_existing_validation(base, attribute) base.validates_uniqueness_of attribute, **new_options end def remove_existing_validation(base, attribute) base._validators[attribute].reject! { _1.kind == :uniqueness } base._validate_callbacks.each do |callback| next unless callback.filter.try(:attributes)&.include?(attribute) && callback.filter.kind == :uniqueness callback.filter.attributes.delete(attribute) end end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
solidus_act_as_tenant-0.0.4 | lib/solidus_act_as_tenant/tenant_aware.rb |
solidus_act_as_tenant-0.0.3 | lib/solidus_act_as_tenant/tenant_aware.rb |