johnsbrn-classy-inheritance 0.6.8.2 → 0.6.8.3
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.
- data/lib/classy-inheritance.rb +91 -70
- metadata +3 -2
data/lib/classy-inheritance.rb
CHANGED
@@ -1,51 +1,87 @@
|
|
1
1
|
require 'active_record/version'
|
2
2
|
module ActiveRecord
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def
|
8
|
-
if
|
9
|
-
|
10
|
-
|
3
|
+
|
4
|
+
# fix active record has_one primary key bug rails 2.2.2 - http://rails.lighthouseapp.com/projects/8994/tickets/1756-has_one-with-foreign_key-primary_key-bug
|
5
|
+
if ActiveRecord::VERSION::MAJOR == 2 && ActiveRecord::VERSION::MINOR == 2
|
6
|
+
module ClassMethods
|
7
|
+
def has_one(association_id, options = {})
|
8
|
+
if options[:through]
|
9
|
+
reflection = create_has_one_through_reflection(association_id, options)
|
10
|
+
association_accessor_methods(reflection, ActiveRecord::Associations::HasOneThroughAssociation)
|
11
11
|
else
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
reflection = create_has_one_reflection(association_id, options)
|
13
|
+
|
14
|
+
ivar = "@#{reflection.name}"
|
15
|
+
|
16
|
+
method_name = "has_one_after_save_for_#{reflection.name}".to_sym
|
17
|
+
define_method(method_name) do
|
18
|
+
association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
|
19
|
+
|
20
|
+
primary_key = reflection.options[:primary_key] || :id
|
21
|
+
if !association.nil? && (new_record? || association.new_record? || association[reflection.primary_key_name] != send(primary_key))
|
22
|
+
association[reflection.primary_key_name] = send(primary_key)
|
23
|
+
association.save(true)
|
24
|
+
end
|
15
25
|
end
|
26
|
+
after_save method_name
|
27
|
+
|
28
|
+
add_single_associated_validation_callbacks(reflection.name) if options[:validate] == true
|
29
|
+
association_accessor_methods(reflection, ActiveRecord::Associations::HasOneAssociation)
|
30
|
+
association_constructor_method(:build, reflection, ActiveRecord::Associations::HasOneAssociation)
|
31
|
+
association_constructor_method(:create, reflection, ActiveRecord::Associations::HasOneAssociation)
|
32
|
+
|
33
|
+
configure_dependency_for_has_one(reflection)
|
16
34
|
end
|
17
35
|
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
if ActiveRecord::VERSION::MAJOR == 2
|
40
|
+
module Associations
|
41
|
+
class HasOneAssociation
|
18
42
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
43
|
+
# this is fixed in 2.3, but it doesn't hurt to leave it here
|
44
|
+
def set_belongs_to_association_for(record)
|
45
|
+
if @reflection.options[:as]
|
46
|
+
record["#{@reflection.options[:as]}_id"] = @owner.id unless @owner.new_record?
|
47
|
+
record["#{@reflection.options[:as]}_type"] = @owner.class.base_class.name.to_s
|
48
|
+
else
|
49
|
+
unless @owner.new_record?
|
50
|
+
primary_key = @reflection.options[:primary_key] || :id
|
51
|
+
record[@reflection.primary_key_name] = @owner.send(primary_key)
|
52
|
+
end
|
53
|
+
end
|
28
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
#this is still not fixed in 2.3
|
58
|
+
def new_record(replace_existing)
|
59
|
+
# Make sure we load the target first, if we plan on replacing the existing
|
60
|
+
# instance. Otherwise, if the target has not previously been loaded
|
61
|
+
# elsewhere, the instance we create will get orphaned.
|
62
|
+
load_target if replace_existing
|
63
|
+
record = @reflection.klass.send(:with_scope, :create => construct_scope[:create]) do
|
64
|
+
yield @reflection
|
65
|
+
end
|
29
66
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
67
|
+
if replace_existing
|
68
|
+
replace(record, true)
|
69
|
+
else
|
70
|
+
unless @owner.new_record?
|
71
|
+
primary_key = @reflection.options[:primary_key] || :id
|
72
|
+
record[@reflection.primary_key_name] = @owner.send(primary_key)
|
73
|
+
end
|
74
|
+
self.target = record
|
36
75
|
end
|
37
|
-
self.target = record
|
38
|
-
end
|
39
76
|
|
40
|
-
|
77
|
+
record
|
78
|
+
end
|
41
79
|
end
|
42
80
|
end
|
43
81
|
end
|
44
82
|
|
45
83
|
if ActiveRecord::VERSION::MAJOR == 2 && ActiveRecord::VERSION::MINOR == 3
|
46
|
-
|
47
84
|
module AutosaveAssociation
|
48
|
-
|
49
85
|
# fix active record has_one primary key bug rails 2.3 - http://rails.lighthouseapp.com/projects/8994/tickets/1756-has_one-with-foreign_key-primary_key-bug
|
50
86
|
def save_has_one_association(reflection)
|
51
87
|
if (association = association_instance_get(reflection.name)) && !association.target.nil?
|
@@ -58,57 +94,42 @@ module ActiveRecord
|
|
58
94
|
end
|
59
95
|
end
|
60
96
|
end
|
61
|
-
|
97
|
+
|
98
|
+
# this is fixed in 2.3.3
|
99
|
+
def save_belongs_to_association(reflection)
|
100
|
+
if association = association_instance_get(reflection.name)
|
101
|
+
autosave = reflection.options[:autosave]
|
62
102
|
|
103
|
+
if autosave && association.marked_for_destruction?
|
104
|
+
association.destroy
|
105
|
+
else
|
106
|
+
association.save(!autosave) if association.new_record? || autosave
|
107
|
+
|
108
|
+
if association.updated?
|
109
|
+
association_id = association.send(reflection.options[:primary_key] || :id)
|
110
|
+
self[reflection.primary_key_name] = association_id
|
111
|
+
# TODO: Removing this code doesn't seem to matter…
|
112
|
+
if reflection.options[:polymorphic]
|
113
|
+
self[reflection.options[:foreign_type]] = association.class.base_class.name.to_s
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
63
120
|
end
|
64
121
|
end
|
65
122
|
|
66
123
|
module Stonean
|
67
124
|
module ClassyInheritance
|
68
|
-
VERSION = '0.6.8.
|
125
|
+
VERSION = '0.6.8.3'
|
69
126
|
|
70
127
|
def self.version
|
71
128
|
VERSION
|
72
129
|
end
|
73
130
|
|
74
131
|
module ClassMethods
|
75
|
-
|
76
|
-
|
77
|
-
# fix active record has_one primary key bug rails 2.2.2 - http://rails.lighthouseapp.com/projects/8994/tickets/1756-has_one-with-foreign_key-primary_key-bug
|
78
|
-
if ActiveRecord::VERSION::MAJOR == 2 && ActiveRecord::VERSION::MINOR == 2
|
79
|
-
|
80
|
-
def has_one(association_id, options = {})
|
81
|
-
if options[:through]
|
82
|
-
reflection = create_has_one_through_reflection(association_id, options)
|
83
|
-
association_accessor_methods(reflection, ActiveRecord::Associations::HasOneThroughAssociation)
|
84
|
-
else
|
85
|
-
reflection = create_has_one_reflection(association_id, options)
|
86
|
-
|
87
|
-
ivar = "@#{reflection.name}"
|
88
|
-
|
89
|
-
method_name = "has_one_after_save_for_#{reflection.name}".to_sym
|
90
|
-
define_method(method_name) do
|
91
|
-
association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
|
92
132
|
|
93
|
-
primary_key = reflection.options[:primary_key] || :id
|
94
|
-
if !association.nil? && (new_record? || association.new_record? || association[reflection.primary_key_name] != send(primary_key))
|
95
|
-
association[reflection.primary_key_name] = send(primary_key)
|
96
|
-
association.save(true)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
after_save method_name
|
100
|
-
|
101
|
-
add_single_associated_validation_callbacks(reflection.name) if options[:validate] == true
|
102
|
-
association_accessor_methods(reflection, ActiveRecord::Associations::HasOneAssociation)
|
103
|
-
association_constructor_method(:build, reflection, ActiveRecord::Associations::HasOneAssociation)
|
104
|
-
association_constructor_method(:create, reflection, ActiveRecord::Associations::HasOneAssociation)
|
105
|
-
|
106
|
-
configure_dependency_for_has_one(reflection)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
133
|
def depends_on(model_sym, options = {})
|
113
134
|
define_relationship(model_sym,options)
|
114
135
|
|
@@ -130,7 +151,7 @@ module Stonean
|
|
130
151
|
end
|
131
152
|
|
132
153
|
# Before save functionality to create/update the requisite object
|
133
|
-
define_save_method(model_sym, options[:as])
|
154
|
+
define_save_method(model_sym, options[:as]) unless options[:autosave]
|
134
155
|
|
135
156
|
# Adds a find_with_<model_sym> class method
|
136
157
|
define_find_with_method(model_sym)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: johnsbrn-classy-inheritance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.8.
|
4
|
+
version: 0.6.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Stone
|
@@ -49,6 +49,7 @@ files:
|
|
49
49
|
- test/test_with_class_name_ending_with_ss.rb
|
50
50
|
has_rdoc: true
|
51
51
|
homepage: http://stonean.com/wiki/classy-inheritance
|
52
|
+
licenses:
|
52
53
|
post_install_message:
|
53
54
|
rdoc_options:
|
54
55
|
- --main
|
@@ -70,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
71
|
requirements: []
|
71
72
|
|
72
73
|
rubyforge_project: classyinherit
|
73
|
-
rubygems_version: 1.
|
74
|
+
rubygems_version: 1.3.5
|
74
75
|
signing_key:
|
75
76
|
specification_version: 2
|
76
77
|
summary: Classy Inheritance adds a depends_on class method to your ActiveRecord model so that you can define requisite objects
|