activerecord-postgres-hstore 0.7.6 → 0.7.7
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.
- checksums.yaml +7 -0
- data/.travis.yml +9 -0
- data/README.md +77 -24
- data/VERSION +1 -1
- data/activerecord-postgres-hstore.gemspec +1 -1
- data/lib/activerecord-postgres-hstore/railties.rb +3 -0
- data/lib/tasks/hstore.rake +7 -0
- metadata +21 -32
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5c1fd061cb95d1132d2674b9e5a3cb7fb5f52787
|
4
|
+
data.tar.gz: 23162c6b3a46e204db025686510fd155fc36fc8c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e1ac2b3843f7e9e89bc1f211b8ebb12b66ab6d2d54ee2afe192e8e4d8376597843fded72e9cc2a912cf90933e164384cbd7b57e718fbbc4fd51c9a6a36d7affd
|
7
|
+
data.tar.gz: 30dea4ce9d3238e1f488828628f36d12dbdf0dc6124c333af75f5f7ffaca922694dda3c83d93850c1dab9d27e28b79bf65b0a477a22d77e54dbceeab6d398009
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
#Goodbye serialize, hello hstore.
|
1
|
+
#Goodbye serialize, hello hstore.
|
2
|
+
|
3
|
+
[](http://travis-ci.org/diogob/activerecord-postgres-hstore)
|
4
|
+
[](https://codeclimate.com/github/diogob/activerecord-postgres-hstore)
|
2
5
|
|
3
6
|
You need dynamic columns in your tables. What do you do?
|
4
7
|
|
@@ -6,6 +9,18 @@ You need dynamic columns in your tables. What do you do?
|
|
6
9
|
* Use a noSQL database just for this issue. Good luck.
|
7
10
|
* Create a serialized column. Nice, insertion will be fine, and reading data from a record too. But, what if you have a condition in your select that includes serialized data? Yeah, regular expressions.
|
8
11
|
|
12
|
+
##Common use cases
|
13
|
+
|
14
|
+
Add settings to users, like in rails-settings or HasEasy.
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
class User < ActiveRecord::Base
|
18
|
+
serialize :settings, ActiveRecord::Coders::Hstore
|
19
|
+
end
|
20
|
+
user = User.create settings: {theme: 'navy'}
|
21
|
+
user.settings['theme']
|
22
|
+
```
|
23
|
+
|
9
24
|
##Note about 0.7
|
10
25
|
|
11
26
|
I have decided to clean up the old code and provide only a custom serializer in this new version.
|
@@ -62,7 +77,7 @@ Well, not yet. Don’t forget to add indexes. Like this:
|
|
62
77
|
CREATE INDEX people_gist_data ON people USING GIST(data);
|
63
78
|
```
|
64
79
|
or
|
65
|
-
```sql
|
80
|
+
```sql
|
66
81
|
CREATE INDEX people_gin_data ON people USING GIN(data);
|
67
82
|
```
|
68
83
|
|
@@ -73,7 +88,7 @@ For the model Person we could create an index (defaults to type GIST) over the d
|
|
73
88
|
class AddIndexToPeople < ActiveRecord::Migration
|
74
89
|
def change
|
75
90
|
add_hstore_index :people, :data
|
76
|
-
end
|
91
|
+
end
|
77
92
|
end
|
78
93
|
```
|
79
94
|
|
@@ -85,7 +100,9 @@ look at [PostgreSQL docs](http://www.postgresql.org/docs/9.2/static/textsearch-i
|
|
85
100
|
This gem only provides a custom serialization coder.
|
86
101
|
If you want to use it just put in your Gemfile:
|
87
102
|
|
88
|
-
|
103
|
+
```ruby
|
104
|
+
gem 'activerecord-postgres-hstore'
|
105
|
+
```
|
89
106
|
|
90
107
|
Now add a line (for each hstore column) on the model you have your hstore columns.
|
91
108
|
Assuming a model called **Person**, with a **data** field on it, the
|
@@ -99,10 +116,12 @@ end
|
|
99
116
|
|
100
117
|
This way, you will automatically start with an empty hash that you can write attributes to.
|
101
118
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
119
|
+
```ruby
|
120
|
+
irb(main):001:0> person = Person.new
|
121
|
+
=> #<Person id: nil, name: nil, data: {}, created_at: nil, updated_at: nil>
|
122
|
+
irb(main):002:0> person.data['favorite_color'] = 'blue'
|
123
|
+
=> "blue"
|
124
|
+
```
|
106
125
|
|
107
126
|
###Querying the database
|
108
127
|
|
@@ -110,48 +129,70 @@ Now you just need to learn a little bit of new
|
|
110
129
|
sqls for selecting stuff (creating and updating is transparent).
|
111
130
|
Find records that contains a key named 'foo’:
|
112
131
|
|
113
|
-
|
132
|
+
```ruby
|
133
|
+
Person.where("data ? 'foo'")
|
134
|
+
```
|
114
135
|
|
115
136
|
Find records where 'foo’ is equal to 'bar’:
|
116
137
|
|
117
|
-
|
138
|
+
```ruby
|
139
|
+
Person.where("data -> 'foo' = 'bar'")
|
140
|
+
```
|
118
141
|
|
119
142
|
This same sql is at least twice as fast (using indexes) if you do it
|
120
143
|
that way:
|
121
144
|
|
122
|
-
|
145
|
+
```ruby
|
146
|
+
Person.where("data @> 'foo=>bar'")
|
147
|
+
```
|
123
148
|
|
124
149
|
Find records where 'foo’ is not equal to 'bar’:
|
125
150
|
|
126
|
-
|
151
|
+
```ruby
|
152
|
+
Person.where("data -> 'foo' <> 'bar'")
|
153
|
+
```
|
127
154
|
|
128
155
|
Find records where 'foo’ is like 'bar’:
|
129
156
|
|
130
|
-
|
157
|
+
```ruby
|
158
|
+
Person.where("data -> 'foo' LIKE '%bar%'")
|
159
|
+
```
|
131
160
|
|
132
161
|
If you need to delete a key in a record, you can do it that way:
|
133
162
|
|
134
|
-
|
163
|
+
```ruby
|
164
|
+
person.destroy_key(:data, :foo)
|
165
|
+
```
|
135
166
|
|
136
167
|
This way you’ll also save the record:
|
137
168
|
|
138
|
-
|
169
|
+
```ruby
|
170
|
+
person.destroy_key!(:data, :foo)
|
171
|
+
```
|
139
172
|
|
140
173
|
The destroy\_key method returns 'self’, so you can chain it:
|
141
174
|
|
142
|
-
|
175
|
+
```ruby
|
176
|
+
person.destroy_key(:data, :foo).destroy_key(:data, :bar).save
|
177
|
+
```
|
143
178
|
|
144
179
|
But there is a shortcuts for that:
|
145
180
|
|
146
|
-
|
181
|
+
```ruby
|
182
|
+
person.destroy_keys(:data, :foo, :bar)
|
183
|
+
```
|
147
184
|
|
148
185
|
And finally, if you need to delete keys in many rows, you can:
|
149
186
|
|
150
|
-
|
187
|
+
```ruby
|
188
|
+
Person.delete_key(:data, :foo)
|
189
|
+
```
|
151
190
|
|
152
191
|
and with many keys:
|
153
192
|
|
154
|
-
|
193
|
+
```ruby
|
194
|
+
Person.delete_keys(:data, :foo, :bar)
|
195
|
+
```
|
155
196
|
|
156
197
|
##Caveats
|
157
198
|
|
@@ -159,12 +200,16 @@ hstore keys and values have to be strings. This means `true` will become `"true"
|
|
159
200
|
|
160
201
|
It is also confusing when querying:
|
161
202
|
|
162
|
-
|
163
|
-
|
203
|
+
```ruby
|
204
|
+
Person.where("data -> 'foo' = :value", value: true).to_sql
|
205
|
+
#=> SELECT "people".* FROM "people" WHERE ("data -> 'foo' = 't'") # notice 't'
|
206
|
+
```
|
164
207
|
|
165
208
|
To avoid the above, make sure all named parameters are strings:
|
166
209
|
|
167
|
-
|
210
|
+
```ruby
|
211
|
+
Person.where("data -> 'foo' = :value", value: some_var.to_s)
|
212
|
+
```
|
168
213
|
|
169
214
|
Have fun.
|
170
215
|
|
@@ -174,11 +219,19 @@ To have hstore enabled when you load your database schema (as happens in rake db
|
|
174
219
|
have two options.
|
175
220
|
|
176
221
|
The first option is creating a template database with hstore installed and set the template option
|
177
|
-
in database.yml to that database.
|
222
|
+
in database.yml to that database. If you use the template1 database for this you don't even need to
|
223
|
+
set the template option, but the extension will be installed in all your databases from now on
|
224
|
+
by default. To install the extension in your template1 database you could simply run:
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
psql -d template1 -c 'create extension hstore;'
|
228
|
+
```
|
178
229
|
|
179
230
|
The second option is to uncomment or add the following line in config/application.rb
|
180
231
|
|
181
|
-
|
232
|
+
```ruby
|
233
|
+
config.active_record.schema_format = :sql
|
234
|
+
```
|
182
235
|
|
183
236
|
This will change your schema dumps from Ruby to SQL. If you're
|
184
237
|
unsure about the implications of this change, we suggest reading this
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6
|
1
|
+
0.7.6
|
@@ -9,6 +9,9 @@ require 'rails/generators/migration'
|
|
9
9
|
# * Initialize ActiveRecord properly
|
10
10
|
# * Add hstore:setup generator
|
11
11
|
class Hstore < Rails::Railtie
|
12
|
+
rake_tasks do
|
13
|
+
load "tasks/hstore.rake"
|
14
|
+
end
|
12
15
|
|
13
16
|
initializer 'activerecord-postgres-hstore' do
|
14
17
|
ActiveSupport.on_load :active_record do
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgres-hstore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.7
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Juan Maiz
|
@@ -10,92 +9,81 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-
|
12
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: activerecord
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- -
|
18
|
+
- - '>='
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: '3.1'
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- -
|
25
|
+
- - '>='
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: '3.1'
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: rake
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - '>='
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '0'
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - '>='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: pg-hstore
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - '>='
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: 1.1.5
|
55
49
|
type: :runtime
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - '>='
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: 1.1.5
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: bundler
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '0'
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
71
|
name: rdoc
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
73
|
requirements:
|
84
|
-
- -
|
74
|
+
- - '>='
|
85
75
|
- !ruby/object:Gem::Version
|
86
76
|
version: '0'
|
87
77
|
type: :development
|
88
78
|
prerelease: false
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
|
-
- -
|
81
|
+
- - '>='
|
93
82
|
- !ruby/object:Gem::Version
|
94
83
|
version: '0'
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
85
|
name: rspec
|
97
86
|
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
87
|
requirements:
|
100
88
|
- - ~>
|
101
89
|
- !ruby/object:Gem::Version
|
@@ -103,7 +91,6 @@ dependencies:
|
|
103
91
|
type: :development
|
104
92
|
prerelease: false
|
105
93
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
94
|
requirements:
|
108
95
|
- - ~>
|
109
96
|
- !ruby/object:Gem::Version
|
@@ -130,6 +117,7 @@ files:
|
|
130
117
|
- lib/activerecord-postgres-hstore/activerecord.rb
|
131
118
|
- lib/activerecord-postgres-hstore/coder.rb
|
132
119
|
- lib/activerecord-postgres-hstore/railties.rb
|
120
|
+
- lib/tasks/hstore.rake
|
133
121
|
- lib/templates/setup_hstore.rb
|
134
122
|
- lib/templates/setup_hstore91.rb
|
135
123
|
- spec/activerecord-coders-hstore_spec.rb
|
@@ -137,26 +125,27 @@ files:
|
|
137
125
|
homepage: http://github.com/engageis/activerecord-postgres-hstore
|
138
126
|
licenses:
|
139
127
|
- MIT
|
128
|
+
metadata: {}
|
140
129
|
post_install_message:
|
141
130
|
rdoc_options: []
|
142
131
|
require_paths:
|
143
132
|
- lib
|
144
133
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
134
|
requirements:
|
147
|
-
- -
|
135
|
+
- - '>='
|
148
136
|
- !ruby/object:Gem::Version
|
149
137
|
version: 1.8.7
|
150
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
-
none: false
|
152
139
|
requirements:
|
153
|
-
- -
|
140
|
+
- - '>='
|
154
141
|
- !ruby/object:Gem::Version
|
155
142
|
version: 1.3.6
|
156
143
|
requirements: []
|
157
144
|
rubyforge_project:
|
158
|
-
rubygems_version:
|
145
|
+
rubygems_version: 2.0.7
|
159
146
|
signing_key:
|
160
|
-
specification_version:
|
147
|
+
specification_version: 4
|
161
148
|
summary: Goodbye serialize, hello hstore
|
162
|
-
test_files:
|
149
|
+
test_files:
|
150
|
+
- spec/activerecord-coders-hstore_spec.rb
|
151
|
+
- spec/spec_helper.rb
|