active_hash 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|