activerecord-spatial 1.0.0 → 2.0.0
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 +4 -4
- data/.rubocop.yml +1670 -0
- data/Gemfile +12 -13
- data/Guardfile +7 -10
- data/MIT-LICENSE +1 -1
- data/README.rdoc +8 -19
- data/Rakefile +2 -1
- data/activerecord-spatial.gemspec +12 -13
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions/active_record.rb +46 -0
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions.rb +7 -38
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/postgis.rb +6 -7
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/unknown_srid.rb +4 -5
- data/lib/activerecord-spatial/active_record/models/geography_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/geometry_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/spatial_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/spatial_ref_sys.rb +5 -6
- data/lib/activerecord-spatial/active_record.rb +0 -1
- data/lib/activerecord-spatial/associations/active_record.rb +62 -120
- data/lib/activerecord-spatial/associations/base.rb +26 -75
- data/lib/activerecord-spatial/associations/preloader/spatial_association.rb +57 -0
- data/lib/activerecord-spatial/associations/reflection/spatial_reflection.rb +41 -0
- data/lib/activerecord-spatial/associations.rb +26 -4
- data/lib/activerecord-spatial/spatial_columns.rb +85 -94
- data/lib/activerecord-spatial/spatial_function.rb +62 -51
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_2_0.rb +48 -0
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_2_2.rb +46 -0
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_legacy.rb +30 -0
- data/lib/activerecord-spatial/spatial_scope_constants.rb +10 -61
- data/lib/activerecord-spatial/spatial_scopes.rb +47 -49
- data/lib/activerecord-spatial/version.rb +1 -2
- data/lib/activerecord-spatial.rb +2 -6
- data/lib/tasks/test.rake +21 -19
- data/test/.rubocop.yml +35 -0
- data/test/accessors_geographies_tests.rb +19 -19
- data/test/accessors_geometries_tests.rb +19 -19
- data/test/adapter_tests.rb +1 -2
- data/test/associations_tests.rb +181 -203
- data/test/geography_column_tests.rb +2 -3
- data/test/geometry_column_tests.rb +1 -2
- data/test/models/bar.rb +2 -3
- data/test/models/blort.rb +1 -2
- data/test/models/foo.rb +2 -3
- data/test/models/foo3d.rb +2 -3
- data/test/models/foo_geography.rb +2 -3
- data/test/models/zortable.rb +2 -3
- data/test/spatial_function_tests.rb +12 -17
- data/test/spatial_scopes_geographies_tests.rb +17 -20
- data/test/spatial_scopes_tests.rb +84 -75
- data/test/test_helper.rb +66 -79
- metadata +16 -14
- data/lib/activerecord-spatial/associations/active_record_3.rb +0 -123
@@ -1,21 +1,6 @@
|
|
1
1
|
|
2
2
|
module ActiveRecord
|
3
3
|
module Associations #:nodoc:
|
4
|
-
class SpatialAssociation < HasManyAssociation
|
5
|
-
attr_reader :geom, :foreign_geom, :relationship, :scope_options
|
6
|
-
|
7
|
-
def initialize(*args)
|
8
|
-
super
|
9
|
-
|
10
|
-
@geom = self.options[:geom]
|
11
|
-
@foreign_geom = self.options[:foreign_geom]
|
12
|
-
@relationship = self.options[:relationship].to_s
|
13
|
-
@scope_options = (self.options[:scope_options] || {}).merge({
|
14
|
-
:column => @foreign_geom
|
15
|
-
})
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
4
|
class Builder::Spatial < Builder::HasMany #:nodoc:
|
20
5
|
SPATIAL_MACRO = :has_many
|
21
6
|
|
@@ -28,65 +13,31 @@ module ActiveRecord
|
|
28
13
|
:inverse_of
|
29
14
|
].freeze
|
30
15
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
16
|
+
def macro
|
17
|
+
SPATIAL_MACRO
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.valid_options(options)
|
21
|
+
super + VALID_SPATIAL_OPTIONS - INVALID_SPATIAL_OPTIONS
|
22
|
+
end
|
35
23
|
end
|
36
24
|
|
37
25
|
class Preloader #:nodoc:
|
38
26
|
class SpatialAssociation < HasMany #:nodoc:
|
39
|
-
SPATIAL_FIELD_ALIAS = '__spatial_ids__'
|
40
|
-
SPATIAL_JOIN_NAME = '__spatial_ids_join__'
|
41
|
-
SPATIAL_JOIN_QUOTED_NAME = %{"#{SPATIAL_JOIN_NAME}"}
|
42
|
-
|
43
|
-
private
|
44
|
-
def associated_records_by_owner
|
45
|
-
owners_map = owners_by_key
|
46
|
-
owner_keys = owners_map.keys.compact
|
47
|
-
|
48
|
-
if klass.nil? || owner_keys.empty?
|
49
|
-
records = []
|
50
|
-
else
|
51
|
-
sliced = owner_keys.each_slice(model.connection.in_clause_length || owner_keys.size)
|
52
|
-
records = sliced.map { |slice| records_for(slice) }.flatten
|
53
|
-
end
|
54
|
-
|
55
|
-
records_by_owner = Hash[owners.map { |owner| [owner, []] }]
|
56
|
-
|
57
|
-
records.each do |record|
|
58
|
-
record[SPATIAL_FIELD_ALIAS].split(',').each do |owner_key|
|
59
|
-
owners_map[owner_key].each do |owner|
|
60
|
-
records_by_owner[owner] << record
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
records_by_owner
|
66
|
-
end
|
67
|
-
end
|
27
|
+
SPATIAL_FIELD_ALIAS = '__spatial_ids__'.freeze
|
28
|
+
SPATIAL_JOIN_NAME = '__spatial_ids_join__'.freeze
|
29
|
+
SPATIAL_JOIN_QUOTED_NAME = %{"#{SPATIAL_JOIN_NAME}"}.freeze
|
30
|
+
end
|
68
31
|
|
69
|
-
|
70
|
-
|
32
|
+
prepend(Module.new do
|
33
|
+
def preloader_for(reflection, *args)
|
34
|
+
if reflection.is_a?(ActiveRecord::Reflection::SpatialReflection)
|
71
35
|
SpatialAssociation
|
72
36
|
else
|
73
|
-
|
37
|
+
super
|
74
38
|
end
|
75
39
|
end
|
76
|
-
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
module Reflection #:nodoc:
|
81
|
-
class AssociationReflection < MacroReflection #:nodoc:
|
82
|
-
def association_class_with_spatial
|
83
|
-
if self.options[:relationship]
|
84
|
-
Associations::SpatialAssociation
|
85
|
-
else
|
86
|
-
association_class_without_spatial
|
87
|
-
end
|
88
|
-
end
|
89
|
-
alias_method_chain :association_class, :spatial
|
40
|
+
end)
|
90
41
|
end
|
91
42
|
end
|
92
43
|
end
|
@@ -98,12 +49,13 @@ end
|
|
98
49
|
#
|
99
50
|
# class Neighbourhood < ActiveRecord::Base
|
100
51
|
# has_many_spatially :cities,
|
101
|
-
# :
|
52
|
+
# relationship: :contains
|
102
53
|
# end
|
103
54
|
#
|
104
55
|
# class City < ActiveRecord::Base
|
105
|
-
# has_many_spatially :neighbourhoods,
|
106
|
-
#
|
56
|
+
# has_many_spatially :neighbourhoods, -> {
|
57
|
+
# where('canonical = true')
|
58
|
+
# }, relationship: :within
|
107
59
|
# end
|
108
60
|
#
|
109
61
|
# Neighbourhood.first.cities
|
@@ -138,7 +90,7 @@ end
|
|
138
90
|
# table. The default here is again +:the_geom+.
|
139
91
|
# * +:scope_options+ - these are options passed directly to the SpatialScopes
|
140
92
|
# module and as such the options are the same as are available there. The
|
141
|
-
# default value here is <tt>{ :
|
93
|
+
# default value here is <tt>{ invert: true }</tt>, as we want our
|
142
94
|
# spatial relationships to say "Foo spatially contains many Bars" and
|
143
95
|
# therefore the relationship in SQL becomes
|
144
96
|
# <tt>ST_contains("foos"."the_geom", "bars"."the_geom")</tt>.
|
@@ -156,11 +108,11 @@ module ActiveRecordSpatial::Associations
|
|
156
108
|
extend ActiveSupport::Concern
|
157
109
|
|
158
110
|
DEFAULT_OPTIONS = {
|
159
|
-
:
|
160
|
-
:
|
161
|
-
:
|
162
|
-
:
|
163
|
-
:
|
111
|
+
relationship: :intersects,
|
112
|
+
geom: ActiveRecordSpatial.default_column_name,
|
113
|
+
foreign_geom: ActiveRecordSpatial.default_column_name,
|
114
|
+
scope_options: {
|
115
|
+
invert: true
|
164
116
|
}
|
165
117
|
}.freeze
|
166
118
|
|
@@ -179,4 +131,3 @@ module ActiveRecordSpatial::Associations
|
|
179
131
|
private :build_options
|
180
132
|
end
|
181
133
|
end
|
182
|
-
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
module ActiveRecord
|
3
|
+
module Associations
|
4
|
+
class Preloader #:nodoc:
|
5
|
+
class SpatialAssociation < HasMany #:nodoc:
|
6
|
+
if method_defined?(:query_scope)
|
7
|
+
def query_scope(ids)
|
8
|
+
spatial_query_scope(ids)
|
9
|
+
end
|
10
|
+
else
|
11
|
+
def records_for(ids)
|
12
|
+
spatial_query_scope(ids)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def association_key_name
|
19
|
+
SPATIAL_FIELD_ALIAS
|
20
|
+
end
|
21
|
+
|
22
|
+
def spatial_query_scope(ids)
|
23
|
+
join_name = model.quoted_table_name
|
24
|
+
column = %{#{SPATIAL_JOIN_QUOTED_NAME}.#{model.quoted_primary_key}}
|
25
|
+
geom = {
|
26
|
+
class: model,
|
27
|
+
table_alias: SPATIAL_JOIN_NAME
|
28
|
+
}
|
29
|
+
|
30
|
+
if reflection.options[:geom].is_a?(Hash)
|
31
|
+
geom.merge!(reflection.options[:geom])
|
32
|
+
else
|
33
|
+
geom[:column] = reflection.options[:geom]
|
34
|
+
end
|
35
|
+
|
36
|
+
where_function = klass.send(
|
37
|
+
"st_#{reflection.options[:relationship]}",
|
38
|
+
geom,
|
39
|
+
(reflection.options[:scope_options] || {}).merge(
|
40
|
+
column: reflection.options[:foreign_geom]
|
41
|
+
)
|
42
|
+
)
|
43
|
+
|
44
|
+
scope.
|
45
|
+
select(%{#{klass.quoted_table_name}.*, array_to_string(array_agg(#{column}), ',') AS "#{SPATIAL_FIELD_ALIAS}"}).
|
46
|
+
joins(
|
47
|
+
"INNER JOIN #{join_name} AS #{SPATIAL_JOIN_QUOTED_NAME} ON (" <<
|
48
|
+
where_function.where_clause.send(:predicates).join(' AND ') <<
|
49
|
+
')'
|
50
|
+
).
|
51
|
+
where(model.arel_table.alias(SPATIAL_JOIN_NAME)[model.primary_key].in(ids)).
|
52
|
+
group(table[klass.primary_key])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module ActiveRecord
|
3
|
+
module Reflection #:nodoc:
|
4
|
+
SPATIAL_REFLECTION_BASE_CLASS = HasManyReflection
|
5
|
+
|
6
|
+
module RuntimeReflectionWithSpatialReflection
|
7
|
+
delegate :geom, :relationship, :scope_options, to: :@reflection
|
8
|
+
end
|
9
|
+
|
10
|
+
RuntimeReflection.prepend RuntimeReflectionWithSpatialReflection
|
11
|
+
|
12
|
+
class SpatialReflection < SPATIAL_REFLECTION_BASE_CLASS #:nodoc:
|
13
|
+
attr_reader :geom, :foreign_geom, :relationship, :scope_options
|
14
|
+
|
15
|
+
def initialize(*args)
|
16
|
+
super(*args.from(1))
|
17
|
+
|
18
|
+
@geom = options[:geom]
|
19
|
+
@foreign_geom = options[:foreign_geom]
|
20
|
+
@relationship = options[:relationship].to_s
|
21
|
+
@scope_options = (options[:scope_options] || {}).merge(column: foreign_geom)
|
22
|
+
end
|
23
|
+
|
24
|
+
def association_class
|
25
|
+
Associations::SpatialAssociation
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
prepend(Module.new do
|
31
|
+
def create(macro, name, scope, options, ar)
|
32
|
+
if options[:relationship] && options[:geom] && options[:foreign_geom]
|
33
|
+
SpatialReflection.new(macro, name, scope, options, ar)
|
34
|
+
else
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,10 +1,32 @@
|
|
1
1
|
|
2
2
|
require 'activerecord-spatial/associations/base'
|
3
|
+
require 'activerecord-spatial/associations/reflection/spatial_reflection'
|
4
|
+
require 'activerecord-spatial/associations/preloader/spatial_association'
|
5
|
+
require 'activerecord-spatial/associations/active_record'
|
3
6
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
module ActiveRecordSpatial::Associations
|
8
|
+
module ClassMethods #:nodoc:
|
9
|
+
def has_many_spatially(name, scope = nil, options = {}, &extension)
|
10
|
+
if scope.is_a?(Hash)
|
11
|
+
options = scope
|
12
|
+
scope = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
options = build_options(options)
|
16
|
+
|
17
|
+
unless ActiveRecordSpatial::SpatialScopeConstants::RELATIONSHIPS.include?(options[:relationship].to_s)
|
18
|
+
raise ArgumentError, %{Invalid spatial relationship "#{options[:relationship]}", expected one of #{ActiveRecordSpatial::SpatialScopeConstants::RELATIONSHIPS.inspect}}
|
19
|
+
end
|
20
|
+
|
21
|
+
reflection = ActiveRecord::Associations::Builder::Spatial.build(self, name, scope, options, &extension)
|
22
|
+
|
23
|
+
if ActiveRecord::Reflection.respond_to?(:add_reflection)
|
24
|
+
ActiveRecord::Reflection.add_reflection(self, name, reflection)
|
25
|
+
end
|
26
|
+
|
27
|
+
reflection
|
28
|
+
end
|
29
|
+
end
|
8
30
|
end
|
9
31
|
|
10
32
|
module ActiveRecord
|
@@ -37,99 +37,97 @@ module ActiveRecordSpatial
|
|
37
37
|
end
|
38
38
|
|
39
39
|
module ClassMethods
|
40
|
-
|
41
|
-
|
42
|
-
@geography_columns = nil
|
43
|
-
|
44
|
-
public
|
45
|
-
# Build call to ActiveRecordSpatial::SpatialFunction.build! that helps
|
46
|
-
# you create spatial function calls.
|
47
|
-
def spatial_function(*args)
|
48
|
-
SpatialFunction.build!(self, *args)
|
49
|
-
end
|
40
|
+
@geometry_columns = nil
|
41
|
+
@geography_columns = nil
|
50
42
|
|
51
|
-
|
43
|
+
# Build call to ActiveRecordSpatial::SpatialFunction.build! that helps
|
44
|
+
# you create spatial function calls.
|
45
|
+
def spatial_function(*args)
|
46
|
+
SpatialFunction.build!(self, *args)
|
47
|
+
end
|
52
48
|
|
53
|
-
|
54
|
-
# table. These are PostgreSQLColumns with values set for
|
55
|
-
# the srid and coord_dimensions properties.
|
56
|
-
def geometry_columns; end
|
49
|
+
# Stubs for documentation purposes:
|
57
50
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
# Returns an Array of available geometry columns in the
|
52
|
+
# table. These are PostgreSQLColumns with values set for
|
53
|
+
# the srid and coord_dimensions properties.
|
54
|
+
def geometry_columns; end
|
62
55
|
|
63
|
-
|
64
|
-
|
56
|
+
# Returns an Array of available geography columns in the
|
57
|
+
# table. These are PostgreSQLColumns with values set for
|
58
|
+
# the srid and coord_dimensions properties.
|
59
|
+
def geography_columns; end
|
65
60
|
|
66
|
-
|
67
|
-
|
61
|
+
# Force a reload of available geometry columns.
|
62
|
+
def geometry_columns!; end
|
68
63
|
|
69
|
-
|
70
|
-
|
64
|
+
# Force a reload of available geography columns.
|
65
|
+
def geography_columns!; end
|
71
66
|
|
72
|
-
|
73
|
-
|
67
|
+
# Grabs a geometry column based on name.
|
68
|
+
def geometry_column_by_name(name); end
|
74
69
|
|
75
|
-
|
76
|
-
|
77
|
-
self.geometry_columns + self.geography_columns
|
78
|
-
end
|
70
|
+
# Grabs a geography column based on name.
|
71
|
+
def geography_column_by_name(name); end
|
79
72
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
73
|
+
# Returns both the geometry and geography columns for a table.
|
74
|
+
def spatial_columns
|
75
|
+
geometry_columns + geography_columns
|
76
|
+
end
|
84
77
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
78
|
+
# Reloads both the geometry and geography columns for a table.
|
79
|
+
def spatial_columns!
|
80
|
+
geometry_columns! + geography_columns!
|
81
|
+
end
|
89
82
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
if !defined?(@#{m}_columns) || @#{m}_columns.nil?
|
95
|
-
@#{m}_columns = ActiveRecordSpatial::#{m.capitalize}Column.where(
|
96
|
-
:f_table_name => self.table_name
|
97
|
-
).to_a
|
98
|
-
@#{m}_columns.freeze
|
99
|
-
end
|
100
|
-
@#{m}_columns
|
101
|
-
end
|
83
|
+
# Grabs a spatial column based on name.
|
84
|
+
def spatial_column_by_name(name)
|
85
|
+
geometry_column_by_name(name) || geography_column_by_name(name)
|
86
|
+
end
|
102
87
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
88
|
+
%w{ geometry geography }.each do |m|
|
89
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
90
|
+
undef :#{m}_columns
|
91
|
+
def #{m}_columns
|
92
|
+
if !defined?(@#{m}_columns) || @#{m}_columns.nil?
|
93
|
+
@#{m}_columns = ActiveRecordSpatial::#{m.capitalize}Column.where(
|
94
|
+
f_table_name: table_name
|
95
|
+
).to_a
|
96
|
+
@#{m}_columns.freeze
|
107
97
|
end
|
98
|
+
@#{m}_columns
|
99
|
+
end
|
108
100
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
101
|
+
undef :#{m}_columns!
|
102
|
+
def #{m}_columns!
|
103
|
+
@#{m}_columns = nil
|
104
|
+
#{m}_columns
|
105
|
+
end
|
106
|
+
|
107
|
+
undef :#{m}_column_by_name
|
108
|
+
def #{m}_column_by_name(name)
|
109
|
+
@#{m}_column_by_name ||= #{m}_columns.inject(HashWithIndifferentAccess.new) do |memo, obj|
|
110
|
+
memo[obj.spatial_column] = obj
|
111
|
+
memo
|
116
112
|
end
|
117
|
-
|
118
|
-
|
119
|
-
|
113
|
+
@#{m}_column_by_name[name]
|
114
|
+
end
|
115
|
+
RUBY
|
116
|
+
end
|
120
117
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
118
|
+
# Quickly grab the SRID for a geometry column.
|
119
|
+
def srid_for(column_name)
|
120
|
+
column = spatial_column_by_name(column_name)
|
121
|
+
column.try(:srid) || ActiveRecordSpatial::UNKNOWN_SRID
|
122
|
+
end
|
126
123
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
124
|
+
# Quickly grab the number of dimensions for a geometry column.
|
125
|
+
def coord_dimension_for(column_name)
|
126
|
+
spatial_column_by_name(column_name).coord_dimension
|
127
|
+
end
|
128
|
+
|
129
|
+
private
|
131
130
|
|
132
|
-
protected
|
133
131
|
# Sets up nifty setters and getters for spatial columns.
|
134
132
|
# The methods created look like this:
|
135
133
|
#
|
@@ -152,19 +150,14 @@ module ActiveRecordSpatial
|
|
152
150
|
create_these = []
|
153
151
|
|
154
152
|
if options.nil?
|
155
|
-
create_these.concat(
|
153
|
+
create_these.concat(spatial_columns)
|
156
154
|
else
|
157
|
-
if options[:geometry_columns]
|
158
|
-
|
159
|
-
end
|
155
|
+
create_these.concat(geometry_columns) if options[:geometry_columns]
|
156
|
+
create_these.concat(geography_columns) if options[:geography_columns]
|
160
157
|
|
161
|
-
if options[:
|
162
|
-
create_these.concat(self.geography_columns)
|
163
|
-
end
|
158
|
+
raise ArgumentError, "You can only specify either :except or :only (#{options.keys.inspect})" if options[:except] && options[:only]
|
164
159
|
|
165
|
-
if options[:except]
|
166
|
-
raise ArgumentError, "You can only specify either :except or :only (#{options.keys.inspect})"
|
167
|
-
elsif options[:except]
|
160
|
+
if options[:except]
|
168
161
|
except = Array.wrap(options[:except]).collect(&:to_s)
|
169
162
|
create_these.reject! { |c| except.include?(c) }
|
170
163
|
elsif options[:only]
|
@@ -174,7 +167,7 @@ module ActiveRecordSpatial
|
|
174
167
|
end
|
175
168
|
|
176
169
|
create_these.each do |k|
|
177
|
-
|
170
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
178
171
|
def #{k.spatial_column}=(geom)
|
179
172
|
if !geom
|
180
173
|
self['#{k.spatial_column}'] = nil
|
@@ -236,16 +229,14 @@ module ActiveRecordSpatial
|
|
236
229
|
|
237
230
|
self['#{k.spatial_column}']
|
238
231
|
end
|
239
|
-
|
240
|
-
self.class_eval(src, __FILE__, line)
|
232
|
+
RUBY
|
241
233
|
|
242
234
|
SPATIAL_COLUMN_OUTPUT_FORMATS.reject { |f| f == 'geos' }.each do |f|
|
243
|
-
|
235
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
244
236
|
def #{k.spatial_column}_#{f}(*args)
|
245
237
|
@#{k.spatial_column}_#{f} ||= self.#{k.spatial_column}_geos.to_#{f}(*args) rescue nil
|
246
238
|
end
|
247
|
-
|
248
|
-
self.class_eval(src, __FILE__, line)
|
239
|
+
RUBY
|
249
240
|
end
|
250
241
|
end
|
251
242
|
end
|
@@ -253,7 +244,7 @@ module ActiveRecordSpatial
|
|
253
244
|
# Creates column accessors for geometry columns only.
|
254
245
|
def create_geometry_column_accessors!(options = {})
|
255
246
|
options = {
|
256
|
-
:
|
247
|
+
geometry_columns: true
|
257
248
|
}.merge(options)
|
258
249
|
|
259
250
|
create_spatial_column_accessors!(options)
|
@@ -262,7 +253,7 @@ module ActiveRecordSpatial
|
|
262
253
|
# Creates column accessors for geometry columns only.
|
263
254
|
def create_geography_column_accessors!(options = {})
|
264
255
|
options = {
|
265
|
-
:
|
256
|
+
geography_columns: true
|
266
257
|
}.merge(options)
|
267
258
|
|
268
259
|
create_spatial_column_accessors!(options)
|
@@ -323,7 +314,7 @@ module ActiveRecordSpatial
|
|
323
314
|
# are equivalent:
|
324
315
|
#
|
325
316
|
# spatial_column_name(:wkt)
|
326
|
-
# spatial_column_name(:
|
317
|
+
# spatial_column_name(format: :wkt)
|
327
318
|
# spatial_column_name_wkt
|
328
319
|
def __spatial_column_name(options = {}); end
|
329
320
|
|