ar_pg_array 0.9.12 → 0.9.13
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/README +12 -1
- data/VERSION +1 -1
- data/lib/ar_pg_array/allways_save.rb +38 -0
- data/lib/ar_pg_array/schema.rb +0 -2
- data/lib/ar_pg_array/schema_cachable.rb +11 -0
- data/lib/ar_pg_array/schema_cacheable.rb +11 -0
- data/lib/ar_pg_array/schema_fix_will_change.rb +13 -0
- data/lib/ar_pg_array.rb +7 -3
- data/spec/pg_array_spec.rb +21 -0
- metadata +9 -5
data/README
CHANGED
@@ -33,7 +33,18 @@ This library adds ability to use PostgreSQL array types with ActiveRecord.
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
Installation
|
37
|
+
============
|
37
38
|
|
39
|
+
gem install ar_pg_array
|
40
|
+
|
41
|
+
Changelog
|
42
|
+
=========
|
43
|
+
|
44
|
+
0.9.13
|
45
|
+
|
46
|
+
Since version 0.9.13 ar_pg_array will try to detect arrays changed inplace.
|
47
|
+
And parsed arrays are now cached in @attributes_cache.
|
48
|
+
Thanks to Romain Beauxis (https://github.com/toots ) for being insistent about this.
|
38
49
|
|
39
50
|
Copyright (c) 2010 Sokolov Yura aka funny_falcon, released under the MIT license
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.13
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module CheckArrayBeforeUpdate
|
3
|
+
def mark_arrays_for_update
|
4
|
+
@attributes_cache.each do |name, value|
|
5
|
+
attribute_will_change!(name) if Array === value && _read_attribute(name) != value
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
if VERSION::MAJOR < 3
|
10
|
+
module CheckArrayBeforeUpdate
|
11
|
+
def self.included(base)
|
12
|
+
base.alias_method_chain :update, :check_array
|
13
|
+
base.send(:alias_method, :_read_attribute, :read_attribute)
|
14
|
+
end
|
15
|
+
|
16
|
+
def update_with_check_array
|
17
|
+
mark_arrays_for_update
|
18
|
+
update_without_check_array
|
19
|
+
end
|
20
|
+
end
|
21
|
+
else
|
22
|
+
module CheckArrayBeforeUpdate
|
23
|
+
include ActiveSupport::Concern
|
24
|
+
|
25
|
+
if VERSION::MAJOR == 3 && VERSION::MINOR >= 2
|
26
|
+
def _read_attribute(attr_name)
|
27
|
+
column_for_attribute(attr_name).type_cast(@attributes[attr_name])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def update(*)
|
32
|
+
mark_arrays_for_update
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
Base.__send__ :include, CheckArrayBeforeUpdate
|
38
|
+
end
|
data/lib/ar_pg_array/schema.rb
CHANGED
@@ -150,7 +150,6 @@ module ActiveRecord
|
|
150
150
|
when :string, :text, :other
|
151
151
|
pa = prepare_array_for_arel_by_base_type(value, base_type)
|
152
152
|
"'#{ quote_string( pa ) }'"
|
153
|
-
#"'#{ pa.gsub("'","''") }'"
|
154
153
|
else
|
155
154
|
raise "Unsupported array base type #{base_type} for arel"
|
156
155
|
end
|
@@ -164,7 +163,6 @@ module ActiveRecord
|
|
164
163
|
prepare_pg_float_array(value)
|
165
164
|
when :string, :text, :other
|
166
165
|
prepare_pg_text_array(value)
|
167
|
-
#prepare_pg_string_array(value, base_type).gsub("''","'")
|
168
166
|
when :datetime, :timestamp, :time
|
169
167
|
prepare_pg_string_array(value, base_type)
|
170
168
|
when :decimal, :boolean, :date, :safe
|
@@ -0,0 +1,11 @@
|
|
1
|
+
adjust_cached_types = lambda do |atcbd|
|
2
|
+
atcbd << /_array$/
|
3
|
+
def atcbd.include?(val)
|
4
|
+
any?{|type| type === val}
|
5
|
+
end
|
6
|
+
end
|
7
|
+
if ActiveRecord::VERSION::MAJOR < 3
|
8
|
+
adjust_cached_types.call(ActiveRecord::AttributeMethods::ATTRIBUTE_TYPES_CACHED_BY_DEFAULT)
|
9
|
+
else
|
10
|
+
adjust_cached_types.call(ActiveRecord::AttributeMethods::Read::ATTRIBUTE_TYPES_CACHED_BY_DEFAULT)
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
adjust_cached_types = lambda do |atcbd|
|
2
|
+
atcbd << /_array$/
|
3
|
+
def atcbd.include?(val)
|
4
|
+
any?{|type| type === val}
|
5
|
+
end
|
6
|
+
end
|
7
|
+
if ActiveRecord::VERSION::MAJOR < 3
|
8
|
+
adjust_cached_types.call(ActiveRecord::AttributeMethods::ATTRIBUTE_TYPES_CACHED_BY_DEFAULT)
|
9
|
+
else
|
10
|
+
adjust_cached_types.call(ActiveRecord::AttributeMethods::Read::ATTRIBUTE_TYPES_CACHED_BY_DEFAULT)
|
11
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Dirty
|
3
|
+
private
|
4
|
+
def attribute_will_change!(attr)
|
5
|
+
val = changed_attributes[attr] = clone_attribute_value(:read_attribute, attr)
|
6
|
+
if Array === val && !(Array === @attributes[attr])
|
7
|
+
send(attr) unless @attributes_cache.has_key?(attr)
|
8
|
+
@attributes[attr] = @attributes_cache[attr]
|
9
|
+
end
|
10
|
+
val
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/ar_pg_array.rb
CHANGED
@@ -3,9 +3,13 @@ require 'active_record/base'
|
|
3
3
|
require 'active_record/connection_adapters/postgresql_adapter'
|
4
4
|
|
5
5
|
require 'ar_pg_array/schema'
|
6
|
+
require 'ar_pg_array/schema_cacheable'
|
6
7
|
require 'ar_pg_array/querying'
|
8
|
+
require 'ar_pg_array/allways_save'
|
7
9
|
require 'ar_pg_array/references_by'
|
8
|
-
if
|
10
|
+
if ActiveRecord::VERSION::MAJOR >= 3
|
9
11
|
require 'ar_pg_array/schema_arel'
|
10
|
-
require 'ar_pg_array/querying_arel'
|
11
|
-
|
12
|
+
require 'ar_pg_array/querying_arel'
|
13
|
+
else
|
14
|
+
require 'ar_pg_array/schema_fix_will_change'
|
15
|
+
end
|
data/spec/pg_array_spec.rb
CHANGED
@@ -131,6 +131,27 @@ describe "PgArray" do
|
|
131
131
|
bulks_where(:ints => [1,2].search_subarray).should == bulks_where(:id=>[1,2,4])
|
132
132
|
end
|
133
133
|
|
134
|
+
it "should be cached in @attributes_cache" do
|
135
|
+
bulk = Bulk.find(1)
|
136
|
+
ar = bulk.ints
|
137
|
+
bulk.ints.should.equal?(ar)
|
138
|
+
ard = ar.dup
|
139
|
+
arn = (bulk.ints << 1)
|
140
|
+
arn.should.equal?(ar)
|
141
|
+
bulk.ints.should.equal?(ar)
|
142
|
+
bulk.ints.should == (ard + [1])
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should allways save changed value' do
|
146
|
+
bulk = Bulk.find(1)
|
147
|
+
old = bulk.ints.dup
|
148
|
+
bulk.ints << 2
|
149
|
+
new = bulk.ints.dup
|
150
|
+
bulk.save
|
151
|
+
bulk.reload
|
152
|
+
bulk.ints.should == new
|
153
|
+
end
|
154
|
+
|
134
155
|
def map_times(times)
|
135
156
|
times.map{|t| t.strftime("%F %T")}
|
136
157
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_pg_array
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.13
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-02-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &84224510 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: 2.3.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *84224510
|
25
25
|
description: ar_pg_array includes support of PostgreSQL's int[], float[], text[],
|
26
26
|
timestamptz[] etc. into ActiveRecord. You could define migrations for array columns,
|
27
27
|
query on array columns.
|
@@ -37,11 +37,15 @@ files:
|
|
37
37
|
- VERSION
|
38
38
|
- init.rb
|
39
39
|
- lib/ar_pg_array.rb
|
40
|
+
- lib/ar_pg_array/allways_save.rb
|
40
41
|
- lib/ar_pg_array/querying.rb
|
41
42
|
- lib/ar_pg_array/querying_arel.rb
|
42
43
|
- lib/ar_pg_array/references_by.rb
|
43
44
|
- lib/ar_pg_array/schema.rb
|
44
45
|
- lib/ar_pg_array/schema_arel.rb
|
46
|
+
- lib/ar_pg_array/schema_cachable.rb
|
47
|
+
- lib/ar_pg_array/schema_cacheable.rb
|
48
|
+
- lib/ar_pg_array/schema_fix_will_change.rb
|
45
49
|
- spec/fixtures/bulk.rb
|
46
50
|
- spec/fixtures/bulks.yml
|
47
51
|
- spec/fixtures/item.rb
|
@@ -72,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
76
|
version: '0'
|
73
77
|
requirements: []
|
74
78
|
rubyforge_project: ar-pg-array
|
75
|
-
rubygems_version: 1.8.
|
79
|
+
rubygems_version: 1.8.12
|
76
80
|
signing_key:
|
77
81
|
specification_version: 3
|
78
82
|
summary: Use power of PostgreSQL Arrays in ActiveRecord
|