View Source Flint.Extensions.PreTransforms (Flint v0.4.0)

The PreTransforms provides a convenient :derive option to express how the field is computed.

By default, this occurs after casting and before validations.

derived fields let you define expressions with support for custom bindings to include any field declarations that occur before the current field.

:derive will automatically put the result of the input expression into the field value. By default, this occurs before any other validation, so you can still have access to field bindings and even the current computed field value (eg. within a :when validation from the When extension).

You can define a derived field with respect to the field itself, in which case it acts as transformation. Typically in Ecto, incoming transformations of this support would happen at the cast step, which means the behavior is determined by the type in which you are casting into. :derive lets you apply a transformation after casting to change that behavior without changing the underlying allowed type.

You can also define a derived field with an expression that does not depend on the field, in which case it is suggested that you use the field macro instead of field! since any input in that case would be thrashed by the derived value. This means that a field can be completely determined as a product of other fields!

defmodule Test do
  use Flint.Schema

  embedded_schema do
    field! :category, Union, oneof: [Ecto.Enum, :decimal, :integer], values: [a: 1, b: 2, c: 3]
    field! :rating, :integer, when: category == target_category
    field :score, derive: rating + category, :integer, gt: 1, lt: 100, when: score > rating
  end
end
Test.new!(%{category: 1, rating: 80}, target_category: 1)

# %Test{category: 1, rating: 80, score: 81}

Summary

Functions

Applies transformations to each field according to the :derive options passed in the schema specification.

Functions

Link to this function

apply_pre_transforms(changeset, bindings \\ [])

View Source

Applies transformations to each field according to the :derive options passed in the schema specification.

These transformations are applied after casting, but before validations when used within the default Flint.Changeset.changeset implementation.

Accepts optional bindings which are passed to evaluated code.