Elixir 如何匹配作用类似于枚举的EXTO方案整数类型

Elixir 如何匹配作用类似于枚举的EXTO方案整数类型,elixir,phoenix-framework,Elixir,Phoenix Framework,在不使用EXTO enum库的情况下,还有哪些方法可以与数据库中类似于enum的整数值进行匹配 例如,在我的模式中,我有以下字段: field :account_status, :integer 因此,在我的函数中,我想知道整数值1,2,3的含义: 1 = VALID 2 = PENDING_CONFIRMATION 3 = CANCELLED 我有什么选择 我能想到的是: def is_valid?(account) account.account_status == 1 end 可

在不使用EXTO enum库的情况下,还有哪些方法可以与数据库中类似于enum的整数值进行匹配

例如,在我的模式中,我有以下字段:

field :account_status, :integer
因此,在我的函数中,我想知道整数值1,2,3的含义:

1 = VALID
2 = PENDING_CONFIRMATION
3 = CANCELLED
我有什么选择

我能想到的是:

def is_valid?(account)
  account.account_status == 1
end
可能会把1储存在EXTO模块中,以供记帐

defmodule Account do 
  @valid 2
end

这是以下最佳实践吗?

在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

所以这些方法应该放在我的体外模型模块中,对吗?这些方法可以放在任何你认为最适合它们的地方:模型,助手,任何模块。如果它们是特定于模型的,我会将它们放入模型中。