@@ -2023,6 +2023,8 @@ defmodule Ecto.Changeset do
20232023 If you need to validate if a single value is inside the given enumerable,
20242024 you should use `validate_inclusion/4` instead.
20252025
2026+ Type of the field must be array.
2027+
20262028 ## Options
20272029
20282030 * `:message` - the message on failure, defaults to "has an invalid entry"
@@ -2036,7 +2038,15 @@ defmodule Ecto.Changeset do
20362038 @ spec validate_subset ( t , atom , Enum . t , Keyword . t ) :: t
20372039 def validate_subset ( changeset , field , data , opts \\ [ ] ) do
20382040 validate_change changeset , field , { :subset , data } , fn _ , value ->
2039- { :array , element_type } = Map . fetch! ( changeset . types , field )
2041+ element_type =
2042+ case Map . fetch! ( changeset . types , field ) do
2043+ { :array , element_type } ->
2044+ element_type
2045+
2046+ type ->
2047+ raise ArgumentError ,
2048+ "validate_subset/4 expects field type to be array, field `#{ inspect ( field ) } ` has type `#{ inspect ( type ) } `"
2049+ end
20402050
20412051 case Enum . any? ( value , fn element -> not Ecto.Type . include? ( element_type , element , data ) end ) do
20422052 true -> [ { field , { message ( opts , "has an invalid entry" ) , [ validation: :subset , enum: data ] } } ]
0 commit comments