dynamic-active-model 0.5.2 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 852238d9a8665ebb05d038009e1ec28714bfb9b1483a55a512e5060f70f87304
4
- data.tar.gz: c424da69e903553c01fabee7a681aa197827571aefde0c5bf941ff116f333581
3
+ metadata.gz: a37ad8867ebc7255e83cbb62c1a70e3394e77db96e230afb669352cd4d68643e
4
+ data.tar.gz: 7fd3f802d8cae2c9bb59856d3cbd0a71c94977b76dc53ee69471b1eb0718fb3c
5
5
  SHA512:
6
- metadata.gz: d3c2bb4ab47309e7ac8bf171ae19048cc294e491f142a3bc7f003932193d26294c1aad119eab369520e3c1dac96d0ce9eeb8823a47d8fe018616812262a80085
7
- data.tar.gz: bc26448991093ba1eae79ec821a1eba176ded6f09cf025ed1123cc113de1fb9a5e0f3e26504cd8b7a40ffc49b78e94db177690fbb2be54944b917fbc70fadd2b
6
+ metadata.gz: 88068b7c0075fb5a23ceb713459f14ecdf8bddb3300f112bf0dd85a7c3a917f5d7607b1127709747af9ffd7737a038d4392498b43f19c759cebca535c653cdb9
7
+ data.tar.gz: da5ea3b6205ed36515493143e98d1188fe54f708e3135ec87845b44b8f7cd1b22fb24deb392bfd84f6f97f0a7261f5582647b09d81ef3c7525d11b9c9cc221a6
@@ -4,12 +4,15 @@ module DynamicActiveModel
4
4
  # DynamicActiveModel::Associations iterates over the models of a
5
5
  # database and adds has_many and belongs_to based on foreign keys
6
6
  class Associations
7
- attr_reader :database
7
+ attr_reader :database,
8
+ :table_indexes
8
9
 
9
10
  def initialize(database)
10
11
  @database = database
12
+ @table_indexes = {}
11
13
  @foreign_keys = database.models.each_with_object({}) do |model, hsh|
12
14
  hsh[model.table_name] = ForeignKey.new(model)
15
+ @table_indexes[model.table_name] = model.connection.indexes(model.table_name)
13
16
  end
14
17
  end
15
18
 
@@ -38,7 +41,11 @@ module DynamicActiveModel
38
41
 
39
42
  def add_relationships(relationship_name, model, belongs_to_model, foreign_key)
40
43
  add_belongs_to(relationship_name, model, belongs_to_model, foreign_key)
41
- add_has_many(relationship_name, belongs_to_model, model, foreign_key)
44
+ if unique_index?(model, foreign_key)
45
+ add_has_one(relationship_name, belongs_to_model, model, foreign_key)
46
+ else
47
+ add_has_many(relationship_name, belongs_to_model, model, foreign_key)
48
+ end
42
49
  end
43
50
 
44
51
  def add_belongs_to(relationship_name, model, belongs_to_model, foreign_key)
@@ -59,6 +66,15 @@ module DynamicActiveModel
59
66
  )
60
67
  end
61
68
 
69
+ def add_has_one(relationship_name, model, has_one_model, foreign_key)
70
+ model.has_one(
71
+ generate_has_one_association_name(relationship_name, model, has_one_model),
72
+ class_name: has_one_model.name,
73
+ foreign_key: foreign_key,
74
+ primary_key: has_one_model.primary_key
75
+ )
76
+ end
77
+
62
78
  def create_foreign_key_to_model_map
63
79
  @foreign_keys.values.each_with_object({}) do |foreign_key, hsh|
64
80
  foreign_key.keys.each do |key, relationship_name|
@@ -73,9 +89,28 @@ module DynamicActiveModel
73
89
  if relationship_name == model.table_name.underscore
74
90
  has_many_model.table_name
75
91
  else
76
- "#{relationship_name}_#{has_many_model.table_name}"
92
+ relationship_name
77
93
  end
78
94
  name.underscore.pluralize.to_sym
79
95
  end
96
+
97
+ def generate_has_one_association_name(relationship_name, model, has_one_model)
98
+ name =
99
+ if relationship_name == model.table_name.underscore
100
+ has_one_model.table_name
101
+ else
102
+ relationship_name
103
+ end
104
+ name.underscore.singularize.to_sym
105
+ end
106
+
107
+ def unique_index?(model, foreign_key)
108
+ indexes = table_indexes[model.table_name]
109
+ indexes.any? do |index|
110
+ index.unique &&
111
+ index.columns.size == 1 &&
112
+ index.columns.first == foreign_key
113
+ end
114
+ end
80
115
  end
81
116
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic-active-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Doug Youch
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-04-28 00:00:00.000000000 Z
10
+ date: 2025-05-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: activerecord
@@ -15,28 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '0'
18
+ version: '4'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '0'
25
+ version: '4'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: inheritance-helper
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - ">="
30
+ - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '0'
32
+ version: '0.2'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ">="
37
+ - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '0'
39
+ version: '0.2'
40
40
  description: Dynamically create ActiveRecord models for tables
41
41
  email: dougyouch@gmail.com
42
42
  executables:
@@ -65,7 +65,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '3.0'
69
69
  required_rubygems_version: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - ">="