active_record-associated_object 0.7.1 → 0.8.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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +9 -0
- data/lib/active_record/associated_object/object_association.rb +4 -1
- data/lib/active_record/associated_object/version.rb +1 -1
- data/lib/generators/associated/USAGE +15 -0
- data/lib/generators/associated/associated_generator.rb +27 -0
- data/lib/generators/associated/templates/associated.rb.tt +5 -0
- data/lib/generators/associated/templates/associated_test.rb.tt +8 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76dd7495e0e2e855e708737a875ff879a8ec840d68f5c80ad4733ece3b72dda6
|
4
|
+
data.tar.gz: '09b38711104836c6c222a1663ddf4e7248ae784b727b597ed61f6436ab2bf17b'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06fc0e959dedecab41a3c0d48d846eda454bd69c48fe8042cad1378c408fd919f688c2e07d5a26d675316556210ae25796585bc56438c8c66e3092c52fe3b1f6
|
7
|
+
data.tar.gz: bd35d99fc113f26d2b49e1fde335db7c28af90e7985ea0d2c60dc9dd8188e05cc2c4102bbe4edf5c45998d2b5cc96cd8f00bcd8974acf858450db479432c84f8
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -62,6 +62,9 @@ We've fixed this so you don't need to care, but this is what's happening.
|
|
62
62
|
> [!TIP]
|
63
63
|
> You can pass multiple names too: `has_object :publisher, :classified, :fortification`. I recommend `-[i]er`, `-[i]ed` and `-ion` as the general naming conventions for your Associated Objects.
|
64
64
|
|
65
|
+
> [!TIP]
|
66
|
+
> Plural Associated Object names are also supported: `Account.has_object :seats` will look up `Account::Seats`.
|
67
|
+
|
65
68
|
See how we're always expecting a link to the model, here `post`?
|
66
69
|
|
67
70
|
Because of that, you can rely on `post` from the associated object:
|
@@ -82,6 +85,12 @@ class Post::Publisher < ActiveRecord::AssociatedObject
|
|
82
85
|
end
|
83
86
|
```
|
84
87
|
|
88
|
+
### Use the generator to help write Associated Objects
|
89
|
+
|
90
|
+
To set up the `Post::Publisher` from above, you can call `bin/rails generate associated Post::Publisher`.
|
91
|
+
|
92
|
+
See `bin/rails generate associated --help` for more info.
|
93
|
+
|
85
94
|
### Forwarding callbacks onto the associated object
|
86
95
|
|
87
96
|
To further help illustrate how your collaborator Associated Objects interact with your domain model, you can forward callbacks.
|
@@ -14,7 +14,10 @@ module ActiveRecord::AssociatedObject::ObjectAssociation
|
|
14
14
|
module ClassMethods
|
15
15
|
def has_object(*names, **callbacks)
|
16
16
|
extend_source_from(names) do |name|
|
17
|
-
|
17
|
+
const_get object_name = name.to_s.camelize
|
18
|
+
"def #{name}; (@associated_objects ||= {})[:#{name}] ||= #{object_name}.new(self); end"
|
19
|
+
rescue NameError
|
20
|
+
raise "The #{self}::#{object_name} associated object referenced from #{self} doesn't exist"
|
18
21
|
end
|
19
22
|
|
20
23
|
extend_source_from(names) do |name|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Description:
|
2
|
+
Create a PORO collaborator associated object inheriting from `ActiveRecord::AssociatedObject` that's associated with an Active Record record class.
|
3
|
+
|
4
|
+
It'll be associated on the record with `has_object`.
|
5
|
+
|
6
|
+
Note: associated object names support pluralized class names. So "Seats" remain "seats" in all cases, and "Seat" remains "seat" in all cases.
|
7
|
+
Example:
|
8
|
+
bin/rails generate associated Organization::Seats
|
9
|
+
|
10
|
+
This will create:
|
11
|
+
app/models/organization/seats.rb
|
12
|
+
test/models/organization/seats_test.rb
|
13
|
+
|
14
|
+
And in Organization, this will insert:
|
15
|
+
has_object :seats
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class AssociatedGenerator < Rails::Generators::NamedBase
|
2
|
+
source_root File.expand_path("templates", __dir__)
|
3
|
+
|
4
|
+
def generate_associated_object_files
|
5
|
+
template "associated.rb", "app/models/#{name.underscore}.rb"
|
6
|
+
template "associated_test.rb", "test/models/#{name.underscore}_test.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
def connect_associated_object
|
10
|
+
record_file = "#{destination_root}/app/models/#{record_path}.rb"
|
11
|
+
raise "Record class '#{record_klass}' does not exist" unless File.exist?(record_file)
|
12
|
+
|
13
|
+
inject_into_class record_file, record_klass do
|
14
|
+
optimize_indentation "has_object :#{associated_object_path}", 2
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# The `:name` argument can handle model names, but associated object class names aren't singularized.
|
21
|
+
# So these record and associated_object methods prevent that.
|
22
|
+
def record_path = record_klass.downcase.underscore
|
23
|
+
def record_klass = name.deconstantize
|
24
|
+
|
25
|
+
def associated_object_path = associated_object_class.downcase.underscore
|
26
|
+
def associated_object_class = name.demodulize
|
27
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record-associated_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kasper Timm Hansen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -43,6 +43,10 @@ files:
|
|
43
43
|
- lib/active_record/associated_object/object_association.rb
|
44
44
|
- lib/active_record/associated_object/railtie.rb
|
45
45
|
- lib/active_record/associated_object/version.rb
|
46
|
+
- lib/generators/associated/USAGE
|
47
|
+
- lib/generators/associated/associated_generator.rb
|
48
|
+
- lib/generators/associated/templates/associated.rb.tt
|
49
|
+
- lib/generators/associated/templates/associated_test.rb.tt
|
46
50
|
homepage: https://github.com/kaspth/active_record-associated_object
|
47
51
|
licenses:
|
48
52
|
- MIT
|
@@ -65,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
69
|
- !ruby/object:Gem::Version
|
66
70
|
version: '0'
|
67
71
|
requirements: []
|
68
|
-
rubygems_version: 3.5.
|
72
|
+
rubygems_version: 3.5.6
|
69
73
|
signing_key:
|
70
74
|
specification_version: 4
|
71
75
|
summary: Associate a Ruby PORO with an Active Record class and have it quack like
|