2016-05-01 4 views
0

メールアドレスを保存するEmailモデルがあります。私はそれを保存する前にvalueをダウンしたいと思います。プラス私はそれのMD5合計を作成してmd5sumに保存したいと思います。フェニックスでこれを行う最もクリーンな方法は何ですか?メールアドレスをダウンして保存する前にMD5の合計を作成する

ウェブ/モデル/ 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 
+0

をあなたは何を持っています試した?あなたが試したことや失敗したことを知るのを手助けする方が簡単でしょう。 – michalmuskala

+0

私はまだ精神的にRailsの世界で立ち往生しており、コールバック関数を探しています。 – wintermeyer

+0

@wintermeyerコールバックは悪いですが、あなたは長期的にサポート可能なものを作ることを計画しているなら、あなたはそれほど遠くには行きません。 – JustMichael

答えて

4

私はchangesetにそれらを介して2つの機能とのパイプを作成します。

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 

デモ:

iex(1)> changeset = Email.changeset(%Email{}, %{value: "[email protected]"}) 
iex(2)> changeset.changes 
%{md5sum: <<180, 141, 239, 100, 87, 88, 185, 85, 55, 212, 66, 76, 132, 209, 169, 255>>, 
    value: "[email protected]"} 
+0

downcased MD5の合計を得るためにそれを使用している人のために: 'md5sum =:crypto.hash(:md5、value)|> Base.encode16 |> String.downcase' – wintermeyer

+0

ダウンケーシング関数の場合、' Ecto。 Changeset.update_change/3'を実行します。 – michalmuskala

+0

@wintermeyer '|> Base.encode16(case :: lower)'を実行し、 'String.downcase'をスキップすることもできます。 – Dogbert

関連する問題