Skip to content

Commit bd2b606

Browse files
Merge pull request rails#52798 from fatkodima/generates_token_for-cpk-models
Fix `find_by_token_for` for models with composite primary keys
2 parents 69c86f9 + 8617a7c commit bd2b606

File tree

3 files changed

+11
-1
lines changed

3 files changed

+11
-1
lines changed

activerecord/lib/active_record/token_for.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ module RelationMethods
4040
# +nil+ if the token is invalid or the record was not found.
4141
def find_by_token_for(purpose, token)
4242
raise UnknownPrimaryKey.new(self) unless model.primary_key
43-
model.token_definitions.fetch(purpose).resolve_token(token) { |id| find_by(model.primary_key => id) }
43+
model.token_definitions.fetch(purpose).resolve_token(token) { |id| find_by(model.primary_key => [id]) }
4444
end
4545

4646
# Finds a record using a given +token+ for a predefined +purpose+. Raises

activerecord/test/cases/token_for_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require "cases/helper"
44
require "models/matey"
55
require "models/user"
6+
require "models/cpk"
67
require "active_support/message_verifier"
78

89
class TokenForTest < ActiveRecord::TestCase
@@ -144,6 +145,13 @@ class User < ::User
144145
assert_nil custom_pk.find_by_token_for(:lookup, @lookup_token)
145146
end
146147

148+
test "finds record with a composite primary key" do
149+
book = Cpk::Book.create!(id: [1, 3], shop_id: 2)
150+
token = book.generate_token_for(:test)
151+
152+
assert_equal book, Cpk::Book.find_by_token_for(:test, token)
153+
end
154+
147155
test "raises when no primary key has been declared" do
148156
no_pk = Class.new(Matey) do
149157
generates_token_for :parley

activerecord/test/models/cpk/book.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class Book < ActiveRecord::Base
1313

1414
before_destroy :prevent_destroy_if_set
1515

16+
generates_token_for :test
17+
1618
private
1719
def prevent_destroy_if_set
1820
throw(:abort) if fail_destroy

0 commit comments

Comments
 (0)