From b9f78c0e5242363f22854fd54746025442e9dc01 Mon Sep 17 00:00:00 2001 From: Bradley Buda Date: Wed, 22 Aug 2018 10:14:23 -0700 Subject: [PATCH 1/2] GlobalID::Identification clears memoized to_global_id on dup This module is used in ActiveRecord, which resets the model's primary key on `dup`. If we don't clear it here, then a `dup`ed ActiveRecord instance can have an invalid GlobalID. --- lib/global_id/identification.rb | 5 +++++ test/cases/global_identification_test.rb | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/global_id/identification.rb b/lib/global_id/identification.rb index 716151f..b8cba4b 100644 --- a/lib/global_id/identification.rb +++ b/lib/global_id/identification.rb @@ -21,5 +21,10 @@ def to_signed_global_id(options = {}) def to_sgid_param(options = {}) to_signed_global_id(options).to_param end + + def initialize_dup(other) + @global_id = nil + super + end end end diff --git a/test/cases/global_identification_test.rb b/test/cases/global_identification_test.rb index 578f25d..86f51d9 100644 --- a/test/cases/global_identification_test.rb +++ b/test/cases/global_identification_test.rb @@ -29,4 +29,12 @@ class GlobalIdentificationTest < ActiveSupport::TestCase assert_equal SignedGlobalID.create(@model, some: 'param'), @model.to_signed_global_id(some: 'param') assert_equal SignedGlobalID.create(@model, some: 'param'), @model.to_sgid(some: 'param') end + + test 'dup should clear memoized to_global_id' do + global_id = @model.to_global_id + dup_model = @model.dup + dup_model.id = @model.id + 1 + dup_global_id = dup_model.to_global_id + assert_not_equal global_id, dup_global_id + end end From 8b3af4c39977812d782319e6d2ad310f96819425 Mon Sep 17 00:00:00 2001 From: Bradley Buda Date: Thu, 23 Aug 2018 07:59:28 -0700 Subject: [PATCH 2/2] Remove memoization of GlobalID::Identification#to_global_id --- lib/global_id/identification.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/global_id/identification.rb b/lib/global_id/identification.rb index b8cba4b..d64c7d6 100644 --- a/lib/global_id/identification.rb +++ b/lib/global_id/identification.rb @@ -5,7 +5,7 @@ module Identification extend ActiveSupport::Concern def to_global_id(options = {}) - @global_id ||= GlobalID.create(self, options) + GlobalID.create(self, options) end alias to_gid to_global_id @@ -21,10 +21,5 @@ def to_signed_global_id(options = {}) def to_sgid_param(options = {}) to_signed_global_id(options).to_param end - - def initialize_dup(other) - @global_id = nil - super - end end end