active_record-acts_as 2.1.1 → 2.2.0
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/.travis.yml +3 -3
- data/CHANGELOG.md +6 -1
- data/README.md +5 -0
- data/lib/active_record/acts_as/class_methods.rb +13 -0
- data/lib/active_record/acts_as/instance_methods.rb +8 -30
- data/lib/active_record/acts_as/version.rb +1 -1
- data/spec/acts_as_spec.rb +27 -11
- data/spec/models.rb +11 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12fa1c4f20906b7d2352269034b053732a66ff54
|
4
|
+
data.tar.gz: 7589a0647e201e2d3105344038e71aa1bb66508a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e147a8073f32ee2c4ee4bb81c5f13e45e88f2057eac38c8c22b1a7165123a7a5d69550fb719626e76deb2598fa6a9c3b780861c4ff6b31b6f000fc4f33aa33c2
|
7
|
+
data.tar.gz: 378cf9642978a153cbf16a4c2339d21b9fde016724f540fb0df5dbc3be60f7a7bceca384c5d5098fd311ee18fb8f0e49f772fc9c86e8f9a6d155d18d61e18dd5
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
+
## [2.1.1] - 2017-03-22
|
8
|
+
### Fixed
|
9
|
+
- Fix querying subclass with `where`, for `enum` (and possibly other) attributes the detection whether the attribute is defined on the superclass or subclass didn't work.
|
10
|
+
|
7
11
|
## [2.1.0] - 2017-03-17
|
8
12
|
### Added
|
9
13
|
- Access superobjects from query on submodel by calling `.actables`
|
@@ -57,7 +61,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
57
61
|
### Fixed
|
58
62
|
- Fixed `remove_actable` migration helper (https://github.com/hzamani/active_record-acts_as/pull/71, thanks to [nuclearpidgeon](https://github.com/nuclearpidgeon)!)
|
59
63
|
|
60
|
-
[Unreleased]: https://github.com/krautcomputing/active_record-acts_as/compare/v2.1.
|
64
|
+
[Unreleased]: https://github.com/krautcomputing/active_record-acts_as/compare/v2.1.1...HEAD
|
65
|
+
[2.1.1]: https://github.com/krautcomputing/active_record-acts_as/compare/v2.1.0...v2.1.1
|
61
66
|
[2.1.0]: https://github.com/krautcomputing/active_record-acts_as/compare/v2.0.9...v2.1.0
|
62
67
|
[2.0.9]: https://github.com/krautcomputing/active_record-acts_as/compare/v2.0.8...v2.0.9
|
63
68
|
[2.0.8]: https://github.com/krautcomputing/active_record-acts_as/compare/v2.0.7...v2.0.8
|
data/README.md
CHANGED
@@ -172,6 +172,11 @@ acts_as :person, -> { includes(:friends) }
|
|
172
172
|
Make sure you know what you are doing when overwriting `polymorphic` option.
|
173
173
|
|
174
174
|
|
175
|
+
## Caveats
|
176
|
+
|
177
|
+
Multiple `acts_as` in the same class are not supported!
|
178
|
+
|
179
|
+
|
175
180
|
## Migrating from acts_as_relation
|
176
181
|
|
177
182
|
Replace `acts_as_superclass` in models with `actable` and if you where using
|
@@ -18,6 +18,19 @@ module ActiveRecord
|
|
18
18
|
def actables
|
19
19
|
acting_as_model.where(actable_id: select(:id))
|
20
20
|
end
|
21
|
+
|
22
|
+
def method_missing(method, *args, &block)
|
23
|
+
if acting_as_model.respond_to?(method)
|
24
|
+
result = acting_as_model.public_send(method, *args, &block)
|
25
|
+
if result.is_a?(ActiveRecord::Relation)
|
26
|
+
all.joins(acting_as_name.to_sym).merge(result)
|
27
|
+
else
|
28
|
+
result
|
29
|
+
end
|
30
|
+
else
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
21
34
|
end
|
22
35
|
end
|
23
36
|
end
|
@@ -13,16 +13,6 @@ module ActiveRecord
|
|
13
13
|
super || acting_as.changed? || (defined?(@_acting_as_changed) ? @_acting_as_changed : false)
|
14
14
|
end
|
15
15
|
|
16
|
-
def acting_as_foreign_key
|
17
|
-
acting_as[acting_as_reflection.foreign_key]
|
18
|
-
end
|
19
|
-
|
20
|
-
# Is the superclass persisted to the database?
|
21
|
-
def acting_as_persisted?
|
22
|
-
return false if acting_as.nil?
|
23
|
-
!acting_as.id.nil? && !acting_as_foreign_key.nil?
|
24
|
-
end
|
25
|
-
|
26
16
|
def actable_must_be_valid
|
27
17
|
if validates_actable
|
28
18
|
unless acting_as.valid?
|
@@ -96,7 +86,11 @@ module ActiveRecord
|
|
96
86
|
end
|
97
87
|
|
98
88
|
def respond_to?(name, include_private = false, as_original_class = false)
|
99
|
-
as_original_class
|
89
|
+
if as_original_class
|
90
|
+
super(name, include_private)
|
91
|
+
else
|
92
|
+
super(name, include_private) || acting_as.respond_to?(name)
|
93
|
+
end
|
100
94
|
end
|
101
95
|
|
102
96
|
def self_respond_to?(name, include_private = false)
|
@@ -110,26 +104,10 @@ module ActiveRecord
|
|
110
104
|
end
|
111
105
|
|
112
106
|
def method_missing(method, *args, &block)
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
def uses_superclass_for?(method)
|
117
|
-
responds_locally = self_respond_to?(method)
|
118
|
-
if acting_as.respond_to?(method)
|
119
|
-
if responds_locally
|
120
|
-
false
|
121
|
-
else
|
122
|
-
# Only use getters if the superclass has
|
123
|
-
# an instance that is linked to this class instance.
|
124
|
-
if acting_as_persisted?
|
125
|
-
true
|
126
|
-
else
|
127
|
-
responds_locally ? false : true
|
128
|
-
end
|
129
|
-
end
|
107
|
+
if !self_respond_to?(method) && acting_as.respond_to?(method)
|
108
|
+
acting_as.send(method, *args, &block)
|
130
109
|
else
|
131
|
-
|
132
|
-
false
|
110
|
+
super
|
133
111
|
end
|
134
112
|
end
|
135
113
|
end
|
data/spec/acts_as_spec.rb
CHANGED
@@ -86,17 +86,6 @@ RSpec.describe "ActiveRecord::Base model with #acts_as called" do
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
describe "#acting_as_foreign_key" do
|
90
|
-
let(:product_foreign_key_value) do
|
91
|
-
pen.acting_as[pen.acting_as.actable_reflection.foreign_key]
|
92
|
-
end
|
93
|
-
it "return acts_as foreign key value" do
|
94
|
-
pen.save
|
95
|
-
expect(pen.acting_as_foreign_key).to eq(product_foreign_key_value)
|
96
|
-
expect(pen.acting_as_foreign_key).to eq(pen.id)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
89
|
describe "#acting_as=" do
|
101
90
|
it "sets acts_as model" do
|
102
91
|
product = Product.new(name: 'new product', price: 0.99)
|
@@ -370,6 +359,14 @@ RSpec.describe "ActiveRecord::Base model with #acts_as called" do
|
|
370
359
|
end
|
371
360
|
end
|
372
361
|
|
362
|
+
describe '#respond.to?' do
|
363
|
+
it 'returns true for instance methods of the supermodel and submodel' do
|
364
|
+
red_pen = Pen.create!(name: 'red pen', price: 0.8, color: 'red')
|
365
|
+
expect(red_pen.respond_to?(:pen_instance_method)).to eq(true)
|
366
|
+
expect(red_pen.respond_to?(:present)).to eq(true)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
373
370
|
describe ".actables" do
|
374
371
|
before(:each) { clear_database }
|
375
372
|
|
@@ -385,6 +382,25 @@ RSpec.describe "ActiveRecord::Base model with #acts_as called" do
|
|
385
382
|
end
|
386
383
|
end
|
387
384
|
|
385
|
+
context 'class methods' do
|
386
|
+
before(:each) { clear_database }
|
387
|
+
|
388
|
+
context 'when the class method returns a scope' do
|
389
|
+
it 'works' do
|
390
|
+
cheap_pen = Pen.create!(name: 'cheap pen', price: 0.5, color: 'blue')
|
391
|
+
expensive_pen = Pen.create!(name: 'expensive pen', price: 1, color: 'red')
|
392
|
+
|
393
|
+
expect(Pen.with_price_higher_than(0.5).to_a).to eq([expensive_pen])
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
context 'when the class methods returns anything else' do
|
398
|
+
it 'works' do
|
399
|
+
expect(Pen.test_class_method).to eq('test')
|
400
|
+
end
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
388
404
|
context "Querying" do
|
389
405
|
before(:each) { clear_database }
|
390
406
|
|
data/spec/models.rb
CHANGED
@@ -10,6 +10,14 @@ class Product < ActiveRecord::Base
|
|
10
10
|
validates_presence_of :name, :price
|
11
11
|
store :settings, accessors: [:global_option]
|
12
12
|
|
13
|
+
def self.with_price_higher_than(price)
|
14
|
+
where('price > ?', price)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.test_class_method
|
18
|
+
'test'
|
19
|
+
end
|
20
|
+
|
13
21
|
def present
|
14
22
|
"#{name} - $#{price}"
|
15
23
|
end
|
@@ -35,6 +43,9 @@ class Pen < ActiveRecord::Base
|
|
35
43
|
belongs_to :pen_collection, touch: true
|
36
44
|
|
37
45
|
validates_presence_of :color
|
46
|
+
|
47
|
+
def pen_instance_method
|
48
|
+
end
|
38
49
|
end
|
39
50
|
|
40
51
|
class Buyer < ActiveRecord::Base
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record-acts_as
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hassan Zamani
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-04-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sqlite3
|
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
184
|
version: '0'
|
185
185
|
requirements: []
|
186
186
|
rubyforge_project:
|
187
|
-
rubygems_version: 2.6.
|
187
|
+
rubygems_version: 2.6.11
|
188
188
|
signing_key:
|
189
189
|
specification_version: 4
|
190
190
|
summary: Simulate multi-table inheritance for activerecord models
|