From bf135c986ce8a668181f52e2906bc261dbb8abd2 Mon Sep 17 00:00:00 2001 From: Larry Gebhardt Date: Sun, 15 Mar 2020 13:39:43 -0400 Subject: [PATCH] Add `_table_name_for_alias` to replace '.' with '_' when creating an alias to tables in another database Fixes #1310, #1316 --- lib/jsonapi/active_relation/join_manager.rb | 2 +- lib/jsonapi/active_relation_resource.rb | 10 +++++----- lib/jsonapi/basic_resource.rb | 4 ++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/jsonapi/active_relation/join_manager.rb b/lib/jsonapi/active_relation/join_manager.rb index 3d1ec34b5..7227749ec 100644 --- a/lib/jsonapi/active_relation/join_manager.rb +++ b/lib/jsonapi/active_relation/join_manager.rb @@ -149,7 +149,7 @@ def perform_joins(records, options) if relationship == :root unless source_relationship - add_join_details('', {alias: resource_klass._table_name, join_type: :root}) + add_join_details('', {alias: resource_klass._table_name_for_alias, join_type: :root}) end next end diff --git a/lib/jsonapi/active_relation_resource.rb b/lib/jsonapi/active_relation_resource.rb index d9272339d..dc304dc9b 100644 --- a/lib/jsonapi/active_relation_resource.rb +++ b/lib/jsonapi/active_relation_resource.rb @@ -112,7 +112,7 @@ def find_fragments(filters, options = {}) options: options) # This alias is going to be resolve down to the model's table name and will not actually be an alias - resource_table_alias = resource_klass._table_name + resource_table_alias = resource_klass._table_name_for_alias pluck_fields = [Arel.sql("#{concat_table_field(resource_table_alias, resource_klass._primary_key)} AS #{resource_table_alias}_#{resource_klass._primary_key}")] @@ -543,9 +543,9 @@ def find_related_polymorphic_fragments(source_rids, relationship, options, conne related_type = concat_table_field(_table_name, relationship.polymorphic_type) pluck_fields = [ - Arel.sql("#{primary_key} AS #{_table_name}_#{_primary_key}"), - Arel.sql("#{related_key} AS #{_table_name}_#{relationship.foreign_key}"), - Arel.sql("#{related_type} AS #{_table_name}_#{relationship.polymorphic_type}") + Arel.sql("#{primary_key} AS #{_table_name_for_alias}_#{_primary_key}"), + Arel.sql("#{related_key} AS #{_table_name_for_alias}_#{relationship.foreign_key}"), + Arel.sql("#{related_type} AS #{_table_name_for_alias}_#{relationship.polymorphic_type}") ] # Get the additional fields from each relation. There's a limitation that the fields must exist in each relation @@ -826,7 +826,7 @@ def get_aliased_field(path_with_field, join_manager) join_details = join_manager.join_details[path.last_relationship] table_alias = join_details[:alias] else - table_alias = self._table_name + table_alias = self._table_name_for_alias end concat_table_field(table_alias, field_segment.delegated_field_name) diff --git a/lib/jsonapi/basic_resource.rb b/lib/jsonapi/basic_resource.rb index ea8b19ea7..35a400916 100644 --- a/lib/jsonapi/basic_resource.rb +++ b/lib/jsonapi/basic_resource.rb @@ -893,6 +893,10 @@ def _table_name @_table_name ||= _model_class.respond_to?(:table_name) ? _model_class.table_name : _model_name.tableize end + def _table_name_for_alias + @_table_name ||= _table_name.tr('.', '_') + end + def _as_parent_key @_as_parent_key ||= "#{_type.to_s.singularize}_id" end