active_hash 0.9.5 → 0.9.6
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/CHANGELOG +3 -0
- data/README.md +19 -5
- data/active_hash.gemspec +1 -1
- data/lib/active_hash/base.rb +5 -0
- data/lib/active_hash/version.rb +1 -1
- data/lib/associations/associations.rb +21 -2
- data/spec/associations/associations_spec.rb +12 -5
- metadata +8 -8
data/CHANGELOG
CHANGED
data/README.md
CHANGED
|
@@ -167,9 +167,11 @@ To clear all records from the in-memory array, call delete_all:
|
|
|
167
167
|
|
|
168
168
|
Country.delete_all # => does not affect the yaml files in any way - just clears the in-memory array which can be useful for testing
|
|
169
169
|
|
|
170
|
-
## Associations
|
|
170
|
+
## Referencing ActiveHash objects from ActiveRecord Associations
|
|
171
171
|
|
|
172
|
-
|
|
172
|
+
One common use case for ActiveHash is to have top-level objects in memory that ActiveRecord objects belong to.
|
|
173
|
+
|
|
174
|
+
In versions of ActiveRecord previous to 3.1, you should be able to do the following:
|
|
173
175
|
|
|
174
176
|
class Country < ActiveHash::Base
|
|
175
177
|
end
|
|
@@ -178,7 +180,17 @@ You can create has_many and belongs_to associations to and from ActiveRecord. O
|
|
|
178
180
|
belongs_to :country
|
|
179
181
|
end
|
|
180
182
|
|
|
181
|
-
|
|
183
|
+
However, as of ActiveRecord 3.1 support for ActiveRecord's `belong_to` is broken. Instead, you must use the `belongs_to_active_hash` method:
|
|
184
|
+
|
|
185
|
+
class Country < ActiveHash::Base
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
class Person < ActiveRecord::Base
|
|
189
|
+
extend ActiveHash::Associations::ActiveRecordExtensions
|
|
190
|
+
belongs_to_active_hash :country
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
With ActiveRecord versions < 3.1, ActiveHash will also work as a polymorphic parent:
|
|
182
194
|
|
|
183
195
|
class Country < ActiveHash::Base
|
|
184
196
|
end
|
|
@@ -192,10 +204,14 @@ ActiveHash will also work as a polymorphic parent:
|
|
|
192
204
|
person.save
|
|
193
205
|
person.location # => Country.first
|
|
194
206
|
|
|
207
|
+
However, as of ActiveRecord 3.1 this will not work. If you need support for that, please open an issue.
|
|
208
|
+
|
|
195
209
|
You can also use standard rails view helpers, like #collection_select:
|
|
196
210
|
|
|
197
211
|
<%= collection_select :person, :country_id, Country.all, :id, :name %>
|
|
198
212
|
|
|
213
|
+
## Referencing ActiveRecord objects from ActiveHash
|
|
214
|
+
|
|
199
215
|
If you include the ActiveHash::Associations module, you can also create associations from your ActiveHash classes, like so:
|
|
200
216
|
|
|
201
217
|
class Country < ActiveHash::Base
|
|
@@ -225,8 +241,6 @@ Once you define a belongs to, you also get the setter method:
|
|
|
225
241
|
|
|
226
242
|
NOTE: You cannot use ActiveHash objects as children of ActiveRecord and I don't plan on adding support for that. It doesn't really make any sense, since you'd have to hard-code your database ids in your class or yaml files, which is a dependency inversion.
|
|
227
243
|
|
|
228
|
-
Also, the implementation of has_many and belongs_to is very simple - I hope to add better support for it later - it will only work in the trivial cases for now.
|
|
229
|
-
|
|
230
244
|
Thanks to baldwindavid for the ideas and code on that one.
|
|
231
245
|
|
|
232
246
|
## ActiveYaml
|
data/active_hash.gemspec
CHANGED
data/lib/active_hash/base.rb
CHANGED
data/lib/active_hash/version.rb
CHANGED
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
module ActiveHash
|
|
2
2
|
module Associations
|
|
3
3
|
|
|
4
|
+
module ActiveRecordExtensions
|
|
5
|
+
|
|
6
|
+
def belongs_to_active_hash(association_id, options = {})
|
|
7
|
+
options = {
|
|
8
|
+
:class_name => association_id.to_s.classify,
|
|
9
|
+
:foreign_key => association_id.to_s.foreign_key
|
|
10
|
+
}.merge(options)
|
|
11
|
+
|
|
12
|
+
define_method(association_id) do
|
|
13
|
+
options[:class_name].constantize.find_by_id(send(options[:foreign_key]))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
define_method("#{association_id}=") do |new_value|
|
|
17
|
+
attributes[options[:foreign_key].to_sym] = new_value ? new_value.id : nil
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
4
23
|
def self.included(base)
|
|
5
24
|
base.extend Methods
|
|
6
25
|
end
|
|
@@ -17,7 +36,7 @@ module ActiveHash
|
|
|
17
36
|
klass = options[:class_name].constantize
|
|
18
37
|
|
|
19
38
|
if klass.respond_to?(:scoped)
|
|
20
|
-
klass.scoped(:conditions => {
|
|
39
|
+
klass.scoped(:conditions => {options[:foreign_key] => id})
|
|
21
40
|
else
|
|
22
41
|
klass.send("find_all_by_#{options[:foreign_key]}", id)
|
|
23
42
|
end
|
|
@@ -38,7 +57,7 @@ module ActiveHash
|
|
|
38
57
|
end
|
|
39
58
|
|
|
40
59
|
define_method("#{association_id}=") do |new_value|
|
|
41
|
-
attributes[
|
|
60
|
+
attributes[options[:foreign_key].to_sym] = new_value ? new_value.id : nil
|
|
42
61
|
end
|
|
43
62
|
|
|
44
63
|
end
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'active_record'
|
|
2
3
|
|
|
3
4
|
describe ActiveHash::Base, "associations" do
|
|
4
5
|
|
|
5
6
|
before do
|
|
6
7
|
class Country < ActiveRecord::Base
|
|
8
|
+
extend ActiveHash::Associations::ActiveRecordExtensions
|
|
7
9
|
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
|
8
10
|
connection.create_table(:countries, :force => true) {}
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
class School < ActiveRecord::Base
|
|
14
|
+
extend ActiveHash::Associations::ActiveRecordExtensions
|
|
12
15
|
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
|
13
16
|
connection.create_table(:schools, :force => true) do |t|
|
|
14
17
|
t.integer :city_id
|
|
@@ -91,23 +94,27 @@ describe ActiveHash::Base, "associations" do
|
|
|
91
94
|
|
|
92
95
|
end
|
|
93
96
|
|
|
94
|
-
describe
|
|
97
|
+
describe ActiveHash::Associations::ActiveRecordExtensions do
|
|
95
98
|
|
|
96
|
-
|
|
99
|
+
describe "#belongs_to_active_hash" do
|
|
97
100
|
it "finds the correct records" do
|
|
98
|
-
School.
|
|
101
|
+
School.belongs_to_active_hash :city
|
|
99
102
|
city = City.create
|
|
100
103
|
school = School.create :city_id => city.id
|
|
101
104
|
school.city.should == city
|
|
102
105
|
end
|
|
103
106
|
|
|
104
107
|
it "returns nil when the record does not exist" do
|
|
105
|
-
School.
|
|
106
|
-
school = School.create :city_id => nil
|
|
108
|
+
School.belongs_to_active_hash :city
|
|
109
|
+
school = School.create! :city_id => nil
|
|
107
110
|
school.city.should be_nil
|
|
108
111
|
end
|
|
109
112
|
end
|
|
110
113
|
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe "#belongs_to" do
|
|
117
|
+
|
|
111
118
|
context "with an ActiveRecord parent" do
|
|
112
119
|
it "find the correct records" do
|
|
113
120
|
City.belongs_to :country
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: active_hash
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 55
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 9
|
|
9
|
-
-
|
|
10
|
-
version: 0.9.
|
|
9
|
+
- 6
|
|
10
|
+
version: 0.9.6
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Jeff Dean
|
|
@@ -30,11 +30,13 @@ autorequire:
|
|
|
30
30
|
bindir: bin
|
|
31
31
|
cert_chain: []
|
|
32
32
|
|
|
33
|
-
date: 2011-
|
|
33
|
+
date: 2011-08-31 00:00:00 -06:00
|
|
34
34
|
default_executable:
|
|
35
35
|
dependencies:
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
|
-
|
|
37
|
+
name: activesupport
|
|
38
|
+
prerelease: false
|
|
39
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
38
40
|
none: false
|
|
39
41
|
requirements:
|
|
40
42
|
- - ">="
|
|
@@ -45,10 +47,8 @@ dependencies:
|
|
|
45
47
|
- 2
|
|
46
48
|
- 2
|
|
47
49
|
version: 2.2.2
|
|
48
|
-
requirement: *id001
|
|
49
|
-
prerelease: false
|
|
50
50
|
type: :runtime
|
|
51
|
-
|
|
51
|
+
version_requirements: *id001
|
|
52
52
|
description:
|
|
53
53
|
email: jeff@zilkey.com
|
|
54
54
|
executables: []
|