active_model_association_adapters 0.0.2 → 0.0.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.
@@ -49,16 +49,16 @@ module ActiveRecord
|
|
49
49
|
|
50
50
|
module ClassMethods
|
51
51
|
|
52
|
-
def has_one_document(name)
|
52
|
+
def has_one_document(name, options={})
|
53
53
|
__has_one_documents.delete(name)
|
54
54
|
__has_one_documents.push(name)
|
55
|
-
add_has_one_accessors_for(name)
|
55
|
+
add_has_one_accessors_for(name, options)
|
56
56
|
end
|
57
57
|
|
58
|
-
def has_many_documents(name)
|
58
|
+
def has_many_documents(name, options={})
|
59
59
|
__has_many_documents.delete(name)
|
60
60
|
__has_many_documents.push(name)
|
61
|
-
add_has_many_accessors_for(name)
|
61
|
+
add_has_many_accessors_for(name, options)
|
62
62
|
end
|
63
63
|
|
64
64
|
private
|
@@ -71,10 +71,10 @@ module ActiveRecord
|
|
71
71
|
@__has_many_documents ||= Array.new
|
72
72
|
end
|
73
73
|
|
74
|
-
def add_has_many_accessors_for(name)
|
74
|
+
def add_has_many_accessors_for(name, options={})
|
75
75
|
class_eval %Q{
|
76
76
|
def #{name}
|
77
|
-
@#{name} ||= #{name.to_s.classify}.where( (self.class.to_s.underscore + "_id").to_sym => id)
|
77
|
+
@#{name} ||= #{options[:class_name] ? options[:class_name] : name.to_s.classify}.where( (self.class.to_s.underscore + "_id").to_sym => id)
|
78
78
|
end
|
79
79
|
|
80
80
|
def #{name}=(others)
|
@@ -92,10 +92,10 @@ module ActiveRecord
|
|
92
92
|
}
|
93
93
|
end
|
94
94
|
|
95
|
-
def add_has_one_accessors_for(name)
|
95
|
+
def add_has_one_accessors_for(name, options={})
|
96
96
|
class_eval %Q{
|
97
97
|
def #{name}
|
98
|
-
@#{name} ||= #{name.to_s.classify}.first(:conditions => {(self.class.to_s.underscore + "_id").to_sym => id})
|
98
|
+
@#{name} ||= #{options[:class_name] ? options[:class_name] : name.to_s.classify}.first(:conditions => {(self.class.to_s.underscore + "_id").to_sym => id})
|
99
99
|
end
|
100
100
|
|
101
101
|
def #{name}=(other)
|
@@ -2,132 +2,166 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ActiveModelAssociationAdapters do
|
4
4
|
|
5
|
+
ActiveRecord::Base.send(:include, ActiveRecord::Adapters::Mongoid::Associations)
|
6
|
+
|
5
7
|
describe "ActiveRecord to Mongoid adapters" do
|
6
8
|
describe "has_one_document" do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
class Banana
|
13
|
-
include Mongoid::Document
|
14
|
-
field :monkey_id, :type => Integer
|
15
|
-
end
|
16
|
-
|
17
|
-
subject {Monkey.new}
|
9
|
+
context "simple cases" do
|
10
|
+
class Monkey < ActiveRecord::Base
|
11
|
+
has_one_document :banana
|
12
|
+
end
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
class Banana
|
15
|
+
include Mongoid::Document
|
16
|
+
field :monkey_id, :type => Integer
|
17
|
+
end
|
22
18
|
|
23
|
-
|
24
|
-
subject.should respond_to(:banana)
|
25
|
-
end
|
19
|
+
subject {Monkey.new}
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
its(:banana) {should be_nil}
|
21
|
+
it "should have :banana in its @__has_one_documents" do
|
22
|
+
subject.class.instance_variable_get(:@__has_one_documents).should eql([:banana])
|
23
|
+
end
|
32
24
|
|
33
|
-
|
34
|
-
|
35
|
-
|
25
|
+
it "should respond_to :banana" do
|
26
|
+
subject.should respond_to(:banana)
|
27
|
+
end
|
36
28
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
subject.banana = banana_1
|
41
|
-
subject.banana.should eql banana_1
|
42
|
-
end
|
43
|
-
end
|
29
|
+
it "should respond_to :banana=" do
|
30
|
+
subject.should respond_to(:banana=)
|
31
|
+
end
|
44
32
|
|
45
|
-
|
46
|
-
before(:each) do
|
47
|
-
subject.banana = banana_1
|
48
|
-
end
|
33
|
+
its(:banana) {should be_nil}
|
49
34
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
35
|
+
describe "adding a banana" do
|
36
|
+
let(:banana_1) {Banana.new}
|
37
|
+
let(:banana_2) {Banana.new}
|
56
38
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
39
|
+
context "when unsaved" do
|
40
|
+
context "without an existing banana" do
|
41
|
+
it "should get a banana" do
|
42
|
+
subject.banana = banana_1
|
43
|
+
subject.banana.should eql banana_1
|
44
|
+
end
|
63
45
|
end
|
64
|
-
end
|
65
46
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
it "swaps out the banana" do
|
71
|
-
subject.banana = banana_2
|
72
|
-
subject.banana.should eql banana_2
|
73
|
-
end
|
47
|
+
context "with an existing banana" do
|
48
|
+
before(:each) do
|
49
|
+
subject.banana = banana_1
|
50
|
+
end
|
74
51
|
|
75
|
-
|
76
|
-
|
52
|
+
it "swaps out the banana" do
|
53
|
+
subject.banana = banana_2
|
54
|
+
subject.banana.should eql banana_2
|
55
|
+
end
|
77
56
|
end
|
78
57
|
end
|
79
58
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
subject.
|
85
|
-
|
59
|
+
context "when saved" do
|
60
|
+
subject {Monkey.create}
|
61
|
+
context "without an existing banana" do
|
62
|
+
it "should get a banana" do
|
63
|
+
subject.banana = banana_1
|
64
|
+
subject.banana.should eql banana_1
|
86
65
|
end
|
87
66
|
end
|
88
67
|
|
89
|
-
context "
|
68
|
+
context "with an existing banana" do
|
90
69
|
before(:each) do
|
91
|
-
banana_1
|
70
|
+
subject.banana = banana_1
|
71
|
+
end
|
72
|
+
it "swaps out the banana" do
|
73
|
+
subject.banana = banana_2
|
74
|
+
subject.banana.should eql banana_2
|
92
75
|
end
|
93
76
|
|
94
|
-
it "
|
95
|
-
subject.banana
|
96
|
-
subject.save
|
97
|
-
Banana.find(banana_1.id).monkey_id.should eql(subject.id)
|
77
|
+
it "modifies the new banana's monkey_id" do
|
78
|
+
subject.banana.monkey_id.should eql(subject.id)
|
98
79
|
end
|
99
80
|
end
|
100
81
|
|
101
|
-
|
102
|
-
context "when the
|
82
|
+
describe "saving" do
|
83
|
+
context "when the banana is a new record" do
|
84
|
+
it "saves the banana" do
|
85
|
+
subject.banana = banana_1
|
86
|
+
subject.save
|
87
|
+
Banana.find(banana_1.id).monkey_id.should eql(subject.id)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "when the banana is already saved" do
|
103
92
|
before(:each) do
|
104
93
|
banana_1.save
|
94
|
+
end
|
95
|
+
|
96
|
+
it "saves the banana's new foreign key" do
|
105
97
|
subject.banana = banana_1
|
106
98
|
subject.save
|
107
|
-
subject.
|
108
|
-
subject.save
|
99
|
+
Banana.find(banana_1.id).monkey_id.should eql(subject.id)
|
109
100
|
end
|
101
|
+
end
|
110
102
|
|
111
|
-
|
112
|
-
|
113
|
-
|
103
|
+
context "when switching bananas" do
|
104
|
+
context "when the first banana is saved and the second is a new record" do
|
105
|
+
before(:each) do
|
106
|
+
banana_1.save
|
107
|
+
subject.banana = banana_1
|
108
|
+
subject.save
|
109
|
+
subject.banana = banana_2
|
110
|
+
subject.save
|
111
|
+
end
|
112
|
+
|
113
|
+
it "unsets the monkey_id for the first banana" do
|
114
|
+
Banana.find(banana_1.id).monkey_id.should be_nil
|
115
|
+
end
|
116
|
+
end
|
114
117
|
end
|
115
118
|
end
|
116
119
|
end
|
117
120
|
end
|
118
|
-
end
|
119
121
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
122
|
+
describe "builder methods" do
|
123
|
+
its(:build_banana) {should be_an_instance_of(Banana)}
|
124
|
+
describe "create_banana" do
|
125
|
+
it "should be an instance of Banana" do
|
126
|
+
banana = subject.create_banana
|
127
|
+
banana.should be_an_instance_of(Banana)
|
128
|
+
banana.should_not be_new_record
|
129
|
+
end
|
130
|
+
end
|
128
131
|
end
|
129
132
|
end
|
130
|
-
|
133
|
+
|
134
|
+
context "options" do
|
135
|
+
class FileThingie < ActiveRecord::Base
|
136
|
+
has_one_document :metadata, :class_name => "Metadata"
|
137
|
+
has_many_documents :reads, :class_name => "Access"
|
138
|
+
end
|
139
|
+
|
140
|
+
class Metadata
|
141
|
+
include Mongoid::Document
|
142
|
+
end
|
143
|
+
|
144
|
+
class Access
|
145
|
+
include Mongoid::Document
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "class_name option" do
|
149
|
+
subject {FileThingie.create}
|
150
|
+
before(:each) do
|
151
|
+
Metadata.should_receive(:find).any_number_of_times
|
152
|
+
Access.should_receive(:find).any_number_of_times
|
153
|
+
end
|
154
|
+
|
155
|
+
it "defines has_one accessors with the provided class name" do
|
156
|
+
lambda {subject.metadata}.should_not raise_error(NameError)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "defines has_one accessors with the provided class name" do
|
160
|
+
lambda {subject.reads}.should_not raise_error(NameError)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
131
165
|
end
|
132
166
|
|
133
167
|
describe "has_many_documents" do
|
data/spec/spec_helper.rb
CHANGED
@@ -12,7 +12,7 @@ ActiveRecord::Base.establish_connection(
|
|
12
12
|
:adapter => "sqlite3"
|
13
13
|
)
|
14
14
|
|
15
|
-
ar_tables = ["monkeys"]
|
15
|
+
ar_tables = ["monkeys", "file_thingies"]
|
16
16
|
|
17
17
|
ar_tables.each do |table_name|
|
18
18
|
ActiveRecord::Base.connection.create_table table_name, :force => true do |t|
|