2017-03-25 4 views
1

structが永続化されているかどうかを判断する方法はありますか?エクトのinsert_or_updateのソースを掘り出し始めましたが、いくつかのプライベートメソッドに当たって運がない。structが永続化されているかどうかをチェックする方法は?

def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:whatever] 
    |> do_a_thing_on_unsaved_struct 
end 

defp do_a_thing_on_unsaved_struct(struct) do 
    case ARE_YOU_PERSISTED?(struct) do 
    :yes -> struct 
    :no -> do_things(struct) 
    end 
end 

私は何かダムをやっているのですか?

答えて

2

構造体の.__meta__.stateを確認できます。それは(永続化されません)新しいものなら、それは:builtだろう、それが(持続)データベースからロードされた場合、それは:loadedでしょう:

iex(1)> Ecto.get_meta(%Post{}, :state) 
:built 
iex(2)> Ecto.get_meta(Repo.get!(Post, 1), :state) 
:loaded 
+0

それです。ありがとう。私は 'Ecto.get_meta(struct、:state)'も見つけました。私のテストは何かに乗り遅れていますが、それはおそらく私の工場です。 – Grocery

+0

実際には、何とか '' Ecto.Changeset'が '' Ecto.Changeset': '' Ecto.Changeset''が '' key: 、data:#PedalApp.Waypoint <>、valid ?: true> 'Repo.get! 'から来ていますが、何が起きてる? – Grocery

+0

私は実際にチェンジセットを渡しています。オリジナルの構造体はありません。 – Grocery

関連する問題