active_record-acts_as 1.0.0.pre → 1.0.0.rc
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +8 -0
- data/lib/active_record/acts_as/instance_methods.rb +11 -2
- data/lib/active_record/acts_as/querying.rb +12 -0
- data/lib/active_record/acts_as/relation.rb +12 -3
- data/lib/active_record/acts_as/version.rb +1 -1
- data/spec/actable_spec.rb +10 -0
- data/spec/acts_as_spec.rb +21 -0
- data/spec/spec_helper.rb +2 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c137b5172e254e835624861325efa82e6ca2e609
|
4
|
+
data.tar.gz: c1836efae6258976e635b8232d1c7654b3e33838
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17f92b735d3520d7a66da1f75b6e7455963df6d1721557faceaca82c98949fbaab4110588f8254b94268dbeb30ddba1d6f1226424f1cf5edfb3e9e8db61effe2
|
7
|
+
data.tar.gz: 14117fe50dfde347a40a607ac783eca19aedbc46fe3c1a4d66a1bbdb594deb26c4e185d584fa68200c39ad020e7be4af6cc3908fe77356ebe346510015a51815
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
[![Gem Version](https://badge.fury.io/rb/active_record-acts_as.svg)](http://badge.fury.io/rb/active_record-acts_as)
|
1
2
|
[![Build Status](https://travis-ci.org/hzamani/active_record-acts_as.svg)](https://travis-ci.org/hzamani/active_record-acts_as)
|
2
3
|
[![Code Climate](https://codeclimate.com/github/hzamani/active_record-acts_as.png)](https://codeclimate.com/github/hzamani/active_record-acts_as)
|
4
|
+
[![Coverage Status](https://coveralls.io/repos/hzamani/active_record-acts_as/badge.png)](https://coveralls.io/r/hzamani/active_record-acts_as)
|
3
5
|
|
4
6
|
# ActiveRecord::ActsAs
|
5
7
|
|
@@ -148,6 +150,12 @@ acts_as :person, -> { includes(:friends) }
|
|
148
150
|
Make sure you know what you are doing when ovrewriting `polymorphic` option.
|
149
151
|
|
150
152
|
|
153
|
+
## Migrating from acts_as_relation
|
154
|
+
|
155
|
+
Replace `acts_as_superclass` in models with `actable` and if you where using
|
156
|
+
`:as_relation_superclass` option on `create_table` remove it and use `t.actable` on column definitions.
|
157
|
+
|
158
|
+
|
151
159
|
## Contributing
|
152
160
|
|
153
161
|
1. Fork it ( https://github.com/hzamani/active_record-acts_as/fork )
|
@@ -20,7 +20,7 @@ module ActiveRecord
|
|
20
20
|
protected :actable_must_be_valid
|
21
21
|
|
22
22
|
def read_attribute(attr_name, *args, &block)
|
23
|
-
if attribute_method?(attr_name)
|
23
|
+
if attribute_method?(attr_name.to_s)
|
24
24
|
super
|
25
25
|
else
|
26
26
|
acting_as.read_attribute(attr_name, *args, &block)
|
@@ -28,7 +28,7 @@ module ActiveRecord
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def write_attribute(attr_name, value, *args, &block)
|
31
|
-
if attribute_method?(attr_name)
|
31
|
+
if attribute_method?(attr_name.to_s)
|
32
32
|
super
|
33
33
|
else
|
34
34
|
acting_as.send(:write_attribute, attr_name, value, *args, &block)
|
@@ -40,10 +40,19 @@ module ActiveRecord
|
|
40
40
|
acting_as.attributes.except(acting_as_reflection.type, acting_as_reflection.foreign_key).merge(super)
|
41
41
|
end
|
42
42
|
|
43
|
+
def attribute_names
|
44
|
+
super | (acting_as.attribute_names - [acting_as_reflection.type, acting_as_reflection.foreign_key])
|
45
|
+
end
|
46
|
+
|
47
|
+
|
43
48
|
def respond_to?(name, include_private = false)
|
44
49
|
super || acting_as.respond_to?(name)
|
45
50
|
end
|
46
51
|
|
52
|
+
def dup
|
53
|
+
super.acting_as = acting_as.dup
|
54
|
+
end
|
55
|
+
|
47
56
|
def method_missing(method, *args, &block)
|
48
57
|
if acting_as.respond_to?(method)
|
49
58
|
acting_as.send(method, *args, &block)
|
@@ -20,4 +20,16 @@ module ActiveRecord
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
class Relation
|
25
|
+
alias_method :scope_for_create_without_acting_as, :scope_for_create
|
26
|
+
|
27
|
+
def scope_for_create
|
28
|
+
@scope_for_create ||= if acting_as?
|
29
|
+
where_values_hash.merge(where_values_hash(acting_as_model.table_name)).merge(create_with_value)
|
30
|
+
else
|
31
|
+
where_values_hash.merge(create_with_value)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
23
35
|
end
|
@@ -17,14 +17,16 @@ module ActiveRecord
|
|
17
17
|
cattr_reader(:acting_as_name) { name.to_s }
|
18
18
|
cattr_reader(:acting_as_model) { name.to_s.camelize.constantize }
|
19
19
|
class_eval "def acting_as() #{name} || build_#{name} end"
|
20
|
+
alias_method :acting_as=, "#{name}=".to_sym
|
20
21
|
|
21
22
|
include ActsAs::InstanceMethods
|
22
23
|
extend ActsAs::Querying
|
23
24
|
end
|
24
25
|
|
25
26
|
def acting_as?(other = nil)
|
26
|
-
if respond_to?
|
27
|
-
|
27
|
+
if respond_to?(:acting_as_reflection) &&
|
28
|
+
acting_as_reflection.is_a?(ActiveRecord::Reflection::AssociationReflection)
|
29
|
+
other.nil? || acting_as_reflection.name.to_s == other.to_s.underscore
|
28
30
|
else
|
29
31
|
false
|
30
32
|
end
|
@@ -37,10 +39,17 @@ module ActiveRecord
|
|
37
39
|
def actable(options = {})
|
38
40
|
name = options.delete(:as) || :actable
|
39
41
|
|
40
|
-
belongs_to name, {polymorphic: true, dependent: :delete, autosave: true}.merge(options)
|
42
|
+
reflections = belongs_to name, {polymorphic: true, dependent: :delete, autosave: true}.merge(options)
|
43
|
+
|
44
|
+
cattr_reader(:actable_reflection) { reflections[name] }
|
41
45
|
|
42
46
|
alias_method :specific, name
|
43
47
|
end
|
48
|
+
|
49
|
+
def actable?
|
50
|
+
respond_to?(:actable_reflection) &&
|
51
|
+
actable_reflection.is_a?(ActiveRecord::Reflection::AssociationReflection)
|
52
|
+
end
|
44
53
|
end
|
45
54
|
end
|
46
55
|
end
|
data/spec/actable_spec.rb
CHANGED
@@ -13,6 +13,16 @@ RSpec.describe "ActiveRecord::Base subclass with #actable" do
|
|
13
13
|
expect(association).to be_polymorphic
|
14
14
|
end
|
15
15
|
|
16
|
+
describe "#actable?" do
|
17
|
+
it "returns true for actable models" do
|
18
|
+
expect(Product.actable?).to be true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns false for none actable models" do
|
22
|
+
expect(Pen.actable?).to be false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
describe ".specific" do
|
17
27
|
it "return specific submodel" do
|
18
28
|
pen.save
|
data/spec/acts_as_spec.rb
CHANGED
@@ -67,6 +67,23 @@ RSpec.describe "ActiveRecord::Base model with #acts_as called" do
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
describe "#acting_as=" do
|
71
|
+
it "sets acts_as model" do
|
72
|
+
product = Product.new(name: 'new product', price: 0.99)
|
73
|
+
pen = Pen.new
|
74
|
+
pen.acting_as = product
|
75
|
+
expect(pen.acting_as).to eq(product)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#dup" do
|
80
|
+
it "duplicates actable model as well" do
|
81
|
+
p = pen.dup
|
82
|
+
expect(p.name).to eq('pen')
|
83
|
+
expect(p.price).to eq(0.8)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
70
87
|
it "have supermodel attributes accessible on creation" do
|
71
88
|
expect{Pen.create(pen_attributes)}.to_not raise_error
|
72
89
|
end
|
@@ -128,6 +145,10 @@ RSpec.describe "ActiveRecord::Base model with #acts_as called" do
|
|
128
145
|
it "includes supermodel attributes in .to_json responce" do
|
129
146
|
expect(pen.to_json).to eq('{"id":null,"name":"pen","price":0.8,"store_id":null,"color":"red"}')
|
130
147
|
end
|
148
|
+
|
149
|
+
it "includes supermodel attribute names in .attribute_names responce" do
|
150
|
+
expect(pen.attribute_names).to include("id", "color", "name", "price", "store_id")
|
151
|
+
end
|
131
152
|
end
|
132
153
|
|
133
154
|
context "Querying" do
|
data/spec/spec_helper.rb
CHANGED