Какие еще способы сопоставления с целочисленными значениями в базе данных, которые действуют как перечисления, без использования библиотеки перечислений 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
Это следующие лучшие практики?
В 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
Эти методы можно использовать везде, где вы сочтете наиболее подходящим: модель, помощник, любой модуль. Если они зависят от модели, я бы поместил их в модель.
Значит, эти методы должны быть включены в мой модуль модели экто, верно?