Ecto Custom Field Setting

How to set a custom field in ecto changeset pipelines

# declare this in your schema file
defp slugify(changeset, from_field, to_field, options \\ []) do
  case Map.get(changeset.changes, from_field) do
    nil -> changeset
    str -> put_change(changeset, to_field, Slug.slugify(str, options))

# use it like this
# ...
|> slugify(:name, :slug)
# ...

Instead of passing everything as attrs from the outside, you can modify data fields during changeset casting. In this example, the slugify library is used to automatically generate a slug field from a name field, but only if the changeset wants to actually change the name field.