如何检查struct是否持久化?

时间:2017-03-25 04:53:01

标签: phoenix-framework ecto

有没有办法弄清楚结构是否持久存在?我开始为Ecto的toDateString()挖掘源代码,但没有运气,因为它遇到了一些私人方法。我想要这样的东西:

insert_or_update

是否有可能,或者我正在做一些愚蠢的事情?

2 个答案:

答案 0 :(得分:5)

您可以检查结构的.__meta__.state。如果它是一个新的(不是持久的),它将是:built,如果它是从数据库加载的(持久化的),那么它将是:loaded:< / p>

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

答案 1 :(得分:0)

您可以检查struct.data.id的主键是否为id

defp do_a_thing_on_unsaved_struct(struct) do
  if struct.data.id, do: struct, else: do_things(struct)
end