Эликсирная карта проверяет, нет ли пустого и существует ключ

Я пытаюсь выяснить способ проверки, имеет ли хэш параметров в приложении Phoenix (с использованием Elixir) определенный ключ или нет.

В приведенной ниже функции набора параметров в модели параметрам по умолчанию присваивается значение: empty.

def changeset(model, params \\ :empty) do

Мне нужно выяснить, существует ли в хеше ключ с именем: username.

Ответ 1

Просто небольшая терминологическая вещь, params - это карта, а не хеш. Это актуально, когда вы знаете, где искать документацию.

Для карты есть has_key?/2, который возвращает true или false.

Map.has_key?(params, :name)

Поскольку вы используете набор изменений Ecto, вы также можете использовать Ecto.Changeset.get_change/3.

get_change(changeset, key, default \\ nil)

Это возвращает default, если key не задано. Обратите внимание, что если key установлено на nil, то nil все равно будет возвращено. Если nil является допустимым значением для вашего изменения, вы можете установить другой параметр по умолчанию.

Ответ 2

Ответ Газелера, очевидно, действительно хорош. Я бы добавил только сочетание шаблонов в микс, как мне кажется, это самое четкое решение, которое работает не только с фениксом, но и с любой картой в любом месте в Эликсире.

# head-only declaration for default params
def changeset(model, params \\ :empty)

def changeset(model, %{"username" => _} = params) do
  # username field is in params
end

def changeset(model, params) do
  # username is not in params
end