20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/composable/tenant/model_extensions.rb', line 20
def tenant(tenant, scope = nil, **options)
foreign_key = options.fetch(:foreign_key, "#{tenant}_id").to_sym
primary_key = options.fetch(:primary_key, :id).to_sym
options[:optional] = true if options[:optional].nil?
belongs_to tenant, scope, **options
default_scope lambda {
return if Composable::Tenant::DataSet.excluded_tenants.include?(tenant.to_sym)
raise Composable::Tenant::NoTenantSet.new(tenant: tenant) unless Composable::Tenant::DataSet.tenant(tenant)
where(foreign_key => Composable::Tenant::DataSet.tenant(tenant).send(primary_key))
}, all_queries: true
before_validation lambda { |record|
return if Composable::Tenant::DataSet.excluded_tenants.include?(tenant.to_sym)
record.send("#{foreign_key}=", Composable::Tenant::DataSet.tenant(tenant).send(primary_key))
}, on: :create
to_include = Module.new do
define_method "#{foreign_key}=" do |integer|
write_attribute(foreign_key, integer)
raise Composable::Tenant::TenantIsImmutable.new(method_name: "#{foreign_key}=") if send("#{foreign_key}_changed?") &&
persisted? &&
!send("#{foreign_key}_was").nil?
integer
end
define_method "#{tenant}=" do |model|
super(model)
raise Composable::Tenant::TenantIsImmutable.new(method_name: "#{tenant}=") if send("#{foreign_key}_changed?") &&
persisted? &&
!send("#{foreign_key}_was").nil?
model
end
end
include to_include
end
|