Checking multiple similar constraints in a changeset

Hey everyone.

In an app I want some fields for a particular schema to have only integers from 1 to 3. I’m using the validate_inclusion/4 function:

|> validate_inclusion(:field1, 1..3)
|> validate_inclusion(:field2, 1..3)
|> validate_inclusion(:field3, 1..3)
|> validate_inclusion(:field4, 1..3)
|> validate_inclusion(:field5, 1..3)

Is there a better, less verbose way to do this? We can’t pass in a list of atoms to validate_inclusion/4, unfortunately.

Thanks!

Think about the problem differently. Instead of thinking about just chaining changeset calls, you can think about reducing a list of fields onto a changeset. Give a crack at it with Enum.reduce/3.

4 Likes

Should have thought of that! Thanks!

  |> validate_inclusion_multi([:field1, :field2, :field3], 1..3)

 defp validate_inclusion_multi(changeset, attrs, data) do
   Enum.reduce(attrs, changeset, fn (attr, changeset) ->
     validate_inclusion(changeset, attr, data)
     end
   )
 end
3 Likes