在保存之前保留简单的电子邮件地址并创建MD5总和

win*_*yer 1 elixir phoenix-framework

我有一个Email存储电子邮件地址的模型.在保存之前我想要贬低它value.另外,我想创建它的MD5总和并将其保存md5sum.凤凰城最干净的方法是什么?

网络/模型/ email.ex

defmodule MyApp.Email do
  use MyApp.Web, :model

  schema "emails" do
    field :value, :string
    field :md5sum, :string

    timestamps
  end

  @required_fields ~w(value)
  @optional_fields ~w()

  @doc """
  Creates a changeset based on the `model` and `params`.

  If no params are provided, an invalid changeset is returned
  with no validation performed.
  """
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 7

我将创建2个函数并通过它们管道changeset:

def changeset(model, params \\ :empty) do
  model
  |> cast(params, @required_fields, @optional_fields)
  |> downcase_value
  |> fill_md5sum
end

def downcase_value(changeset) do
  update_change(changeset, :value, &String.downcase/1)
end

def fill_md5sum(changeset) do
  if value = get_change(changeset, :value) do
    md5sum = :crypto.hash(:md5, value)
    put_change(changeset, :md5sum, md5sum)
  else
    changeset
  end
end
Run Code Online (Sandbox Code Playgroud)

演示:

iex(1)> changeset = Email.changeset(%Email{}, %{value: "FOO@EXAMPLE.COM"})
iex(2)> changeset.changes
%{md5sum: <<180, 141, 239, 100, 87, 88, 185, 85, 55, 212, 66, 76, 132, 209, 169, 255>>,
  value: "foo@example.com"}
Run Code Online (Sandbox Code Playgroud)