activerecord-postgres-array 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +6 -0
- data/activerecord-postgres-array.gemspec +1 -1
- data/lib/activerecord-postgres-array/activerecord.rb +23 -3
- data/lib/activerecord-postgres-array/string.rb +5 -1
- data/spec/array_ext_spec.rb +4 -0
- data/spec/integration_spec.rb +4 -0
- data/spec/internal/db/schema.rb +1 -0
- metadata +4 -4
data/README.textile
CHANGED
@@ -25,6 +25,12 @@ end
|
|
25
25
|
|
26
26
|
h3. Compatibility with activerecord-postgres-hstore
|
27
27
|
|
28
|
+
**Note**
|
29
|
+
|
30
|
+
As of activerecord-postgres-hstore '0.7.0', @ActiveRecord::Base#arel_attributes_value@ is not monkey patched and therefore does not interfere with loading of this gem.
|
31
|
+
|
32
|
+
If you are using '0.6.0', or earlier, of activerecord-postgres-hstore you must use this gem's version '0.0.8' and the following still applies:
|
33
|
+
|
28
34
|
activerecord-postgres-hstore and activerecord-postgres-array both monkeypatch @ActiveRecord::Base#arel_attributes_values@, which leads to problems if these gems are used together. This gem is aware of activerecord-postgres-hstore and incorporates it in the monkeypatch. However, it is important that activerecord-postgres-array is loaded _after_ activerecord-postgres-hstore for this to work.
|
29
35
|
|
30
36
|
h2. Current limitations
|
@@ -16,8 +16,6 @@ module ActiveRecord
|
|
16
16
|
value = read_attribute(name)
|
17
17
|
if column.type.to_s =~ /_array$/ && value && value.is_a?(Array)
|
18
18
|
value = value.to_postgres_array(new_record?)
|
19
|
-
elsif defined?(::Hstore) && column.type == :hstore && value && value.is_a?(Hash)
|
20
|
-
value = value.to_hstore
|
21
19
|
elsif klass.serialized_attributes.include?(name)
|
22
20
|
value = @attributes[name].serialized_value
|
23
21
|
end
|
@@ -50,6 +48,24 @@ module ActiveRecord
|
|
50
48
|
alias_method_chain :quote, :array
|
51
49
|
end
|
52
50
|
|
51
|
+
class Table
|
52
|
+
# Adds array type for migrations. So you can add columns to a table like:
|
53
|
+
# create_table :people do |t|
|
54
|
+
# ...
|
55
|
+
# t.string_array :real_energy
|
56
|
+
# t.decimal_array :real_energy, :precision => 18, :scale => 6
|
57
|
+
# ...
|
58
|
+
# end
|
59
|
+
PostgreSQLAdapter::POSTGRES_ARRAY_TYPES.each do |column_type|
|
60
|
+
define_method("#{column_type}_array") do |*args|
|
61
|
+
options = args.extract_options!
|
62
|
+
base_type = @base.type_to_sql(column_type.to_sym, options[:limit], options[:precision], options[:scale])
|
63
|
+
column_names = args
|
64
|
+
column_names.each { |name| column(name, "#{base_type}[]", options) }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
53
69
|
class TableDefinition
|
54
70
|
# Adds array type for migrations. So you can add columns to a table like:
|
55
71
|
# create_table :people do |t|
|
@@ -73,7 +89,7 @@ module ActiveRecord
|
|
73
89
|
def type_cast_code_with_array(var_name)
|
74
90
|
if type.to_s =~ /_array$/
|
75
91
|
base_type = type.to_s.gsub(/_array/, '')
|
76
|
-
"#{var_name}.from_postgres_array(:#{base_type})"
|
92
|
+
"#{var_name}.from_postgres_array(:#{base_type.parameterize('_')})"
|
77
93
|
else
|
78
94
|
type_cast_code_without_array(var_name)
|
79
95
|
end
|
@@ -86,6 +102,10 @@ module ActiveRecord
|
|
86
102
|
:decimal_array
|
87
103
|
elsif field_type =~ /character varying.*\[\]/
|
88
104
|
:string_array
|
105
|
+
elsif field_type =~ /^(?:real|double precision)\[\]$/
|
106
|
+
:float_array
|
107
|
+
elsif field_type =~ /timestamp.*\[\]/
|
108
|
+
:timestamp_array
|
89
109
|
elsif field_type =~ /\[\]$/
|
90
110
|
field_type.gsub(/\[\]/, '_array').to_sym
|
91
111
|
else
|
@@ -28,8 +28,12 @@ class String
|
|
28
28
|
|
29
29
|
if base_type == :decimal
|
30
30
|
elements.collect(&:to_d)
|
31
|
-
elsif base_type == :
|
31
|
+
elsif base_type == :float
|
32
|
+
elements.collect(&:to_f)
|
33
|
+
elsif base_type == :integer || base_type == :bigint
|
32
34
|
elements.collect(&:to_i)
|
35
|
+
elsif base_type == :timestamp
|
36
|
+
elements.collect(&:to_time)
|
33
37
|
else
|
34
38
|
elements
|
35
39
|
end
|
data/spec/array_ext_spec.rb
CHANGED
@@ -11,6 +11,10 @@ describe "Array" do
|
|
11
11
|
[1,2,3].to_postgres_array.should == "'{1,2,3}'"
|
12
12
|
end
|
13
13
|
|
14
|
+
it "returns a correct array if used on a float array" do
|
15
|
+
[1.0,2.1,3.2].to_postgres_array.should == "'{1.0,2.1,3.2}'"
|
16
|
+
end
|
17
|
+
|
14
18
|
it "returns a correct array if used on a string array" do
|
15
19
|
["Ruby","on","Rails"].to_postgres_array.should == "'{\"Ruby\",\"on\",\"Rails\"}'"
|
16
20
|
end
|
data/spec/integration_spec.rb
CHANGED
@@ -47,9 +47,13 @@ describe Article do
|
|
47
47
|
|
48
48
|
it "builds valid arrays" do
|
49
49
|
@article.languages = ["English", "German"]
|
50
|
+
@article.prices = [1.2, 1.3]
|
50
51
|
@article.save
|
51
52
|
@article.reload
|
52
53
|
@article.languages_before_type_cast.should == "{English,German}"
|
54
|
+
@article.prices_before_type_cast.should == "{1.2,1.3}"
|
55
|
+
@article.languages.should == ["English", "German"]
|
56
|
+
@article.prices.should == [1.2, 1.3]
|
53
57
|
end
|
54
58
|
|
55
59
|
it "escapes single quotes correctly" do
|
data/spec/internal/db/schema.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgres-array
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 9
|
10
|
+
version: 0.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tim Connor
|
@@ -143,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
143
|
requirements: []
|
144
144
|
|
145
145
|
rubyforge_project:
|
146
|
-
rubygems_version: 1.8.
|
146
|
+
rubygems_version: 1.8.15
|
147
147
|
signing_key:
|
148
148
|
specification_version: 3
|
149
149
|
summary: Adds support for postgres arrays to ActiveRecord
|