如何匹配像枚举一样的ecto方案整数类型

时间:2018-12-18 15:18:25

标签: elixir phoenix-framework

在不使用Ecto枚举库的情况下,还有什么其他方法可以与数据库中充当枚举的整数值进行匹配?

例如,在我的架构中,我有以下字段:

field :account_status, :integer

所以在我的函数中,我也想知道整数1,2,3的含义,以便进行翻译:

1 = VALID
2 = PENDING_CONFIRMATION
3 = CANCELLED

我有什么选择?

我能想到的是:

def is_valid?(account)
  account.account_status == 1
end

也许将1存储在帐户的ecto模块中

defmodule Account do 
  @valid 2
end

这是以下最佳做法吗?

1 个答案:

答案 0 :(得分:3)

在Erlang / Elixir中,我们通常进行模式匹配以完成此任务。

def is_valid?(%{account_status: 1}), do: true
def is_valid?(_), do: false

或者,通过一些元编程:

defmodule M do
  @statuses %{
    valid: 1,
    pending_confirmation: 2,
    cancelled: 3
  }
  @field :account_status

  Enum.each(@statuses, fn {status, value} ->
    def unquote(:"is_#{status}?")(%{@field => unquote(value)}), do: true
    def unquote(:"is_#{status}?")(_), do: false
  end)
end

▶ M.is_valid? %{account_status: 1}
#⇒ true
▶ M.is_valid? %{account_status: 2}
#⇒ false