@@ -287,7 +287,6 @@ def relationships_hash(source, fetchable_fields, include_directives = {})
287287 include_linkage = ia && ia [ :include ]
288288 include_linked_children = ia && !ia [ :include_related ] . empty?
289289
290- options = { filters : ia && ia [ :include_filters ] || { } }
291290 if field_set . include? ( name )
292291 ro = relationship_object ( source , relationship , include_linkage )
293292 hash [ format_key ( name ) ] = ro unless ro . blank?
@@ -300,6 +299,7 @@ def relationships_hash(source, fetchable_fields, include_directives = {})
300299 resources = if source . preloaded_fragments . has_key? ( format_key ( name ) )
301300 source . preloaded_fragments [ format_key ( name ) ] . values
302301 else
302+ options = { filters : ia && ia [ :include_filters ] || { } }
303303 [ source . public_send ( name , options ) ] . flatten ( 1 ) . compact
304304 end
305305 resources . each do |resource |
@@ -468,16 +468,20 @@ def relationship_object(source, relationship, include_linkage = false)
468468
469469 # Extracts the foreign key value for a to_one relationship.
470470 def foreign_key_value ( source , relationship )
471- related_resource_id = if source . preloaded_fragments . has_key? ( format_key ( relationship . name ) )
472- source . preloaded_fragments [ format_key ( relationship . name ) ] . values . first . try ( :id )
473- elsif source . respond_to? ( "#{ relationship . name } _id" )
474- # If you have direct access to the underlying id, you don't have to load the relationship
475- # which can save quite a lot of time when loading a lot of data.
476- # This does not apply to e.g. has_one :through relationships.
477- source . public_send ( "#{ relationship . name } _id" )
478- else
479- source . public_send ( relationship . name ) . try ( :id )
480- end
471+ # If you have changed the key_name, don't even try to look at `"#{relationship.name}_id"`
472+ # just load the association and call the custom key_name
473+ foreign_key_type_changed = relationship . options [ :foreign_key_type_changed ] || false
474+ related_resource_id =
475+ if source . preloaded_fragments . has_key? ( format_key ( relationship . name ) )
476+ source . preloaded_fragments [ format_key ( relationship . name ) ] . values . first . try ( :id )
477+ elsif !foreign_key_type_changed && source . respond_to? ( "#{ relationship . name } _id" )
478+ # If you have direct access to the underlying id, you don't have to load the relationship
479+ # which can save quite a lot of time when loading a lot of data.
480+ # This does not apply to e.g. has_one :through relationships.
481+ source . public_send ( "#{ relationship . name } _id" )
482+ else
483+ source . public_send ( relationship . name ) . try ( :id )
484+ end
481485 return nil unless related_resource_id
482486 @id_formatter . format ( related_resource_id )
483487 end
0 commit comments