Чтобы проверить наличие параметра, вы можете добавить поле в атрибут модуля required_fields
в модели. Затем вы передаете это методу cast
модели, который проверяет наличие поля.
Но что, если вы хотите только проверить наличие чего-либо при вставке или обновлении?
Например, я хочу проверить наличие пароля пользователя только в том случае, если запись не сохраняется. Другими словами, я не хочу, чтобы пользователь вводил пароль при редактировании информации своей учетной записи.
Лучшее, что я придумал, - это иметь два разных набора обязательных полей для обновления и вставки, а затем выбрать подходящий метод:
# in changeset method
cast(params, required_fields(model), @optional_fields)
defp required_fields(model) do
if Map.has_key?(model, :id) do
@update_required_fields
else
@insert_required_fields
end
end
Это разумно, или есть лучший способ?
РЕДАКТИРОВАТЬ
Добавление предложений от @michalmuskala с добавлением дополнительного вопроса об общих функциях набора изменений:
def insert_changeset(model, params \\ :empty) do
model
|> cast(params, @insert_required_fields, @insert_optional_fields)
|> shared_changeset
end
def update_changeset(model, params \\ :empty) do
model
|> cast(params, @update_required_fields, @update_optional_fields)
|> shared_changeset
end
defp shared_changeset(changeset) do
changeset
|> validate_password
|> unique_constraint(:email)
end