如何匹配像枚举一样的 ecto scheme 整数类型
How to match against ecto scheme integer types that act like enums
在不使用 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 存储在 Account
的 ecto 模块中
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
在不使用 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 存储在 Account
的 ecto 模块中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