2016-11-26 4 views
2

Каков правильный способ выполнения проверки на Struct с переданной ассоциацией явно?Ecto validate_required on belongs_to, когда Struct или nil прошел

def changeset(model, params \\ %{}) do 
    model 
    |> cast(params, [:name]) 
    |> validate_required([:make, :name]) 
    |> update_change(:name, &String.downcase/1) 
    |> unique_constraint(:name, name: :models_name_make_id_index) 
end 

Как я собираюсь использовать:

changeset(%Model{make: make}, %{....}) 

Где делают может быть равен нулю. И я хочу получить правильное сообщение об ошибке вместо:

** (UndefinedFunctionError) function nil.id/0 is undefined or private 

ответ

1

Валидации в основном предназначены для обработки пользовательского ввода, а не для обеспечения согласованности данных. Если вы произвольно создаете данные, проверки не являются правильным инструментом для защиты от ошибок программиста (в случае, если кто-то забыл о добавлении ассоциации) - ограничения базы данных.

При обработке пользовательского ввода для ассоциаций такие функции, как cast_assoc/3 и cast_embed/3, принимают опцию required: true, чтобы обеспечить соблюдение присутствия ассоциации.

Возможно, было бы неплохо создать функцию, которая делает правильную вещь, и добавит ассоциацию вместо того, чтобы рассеивать эту логику над контроллерами (или другими местами, вызывающими функцию набора изменений).

+0

Хорошо, это то, о чем я подумал и, наконец, закончил с функцией, которая соответствует шаблону, предоставленному партнеру :(Хотя было бы неплохо бы заблокировать его навсегда в одном месте. –

+0

@ IvanYouroff вы могли бы предоставить эту функцию здесь? – Johannes

+0

Он развил бит. Изначально это был просто сопоставление шаблонов в результате предыдущей операции. Поэтому, чтобы упростить жизнь, я создал крошечную библиотеку, реализующую монолитный тип Result и Option. Это звучит странно, но на самом деле это всего лишь кортеж с макросом ok (значение) преобразуется в {: ok, value} и error (e) в {: error, e}, который идеально подходит для большинства библиотек Erlang/Elixir. Вот библиотека: https://github.com/youroff/monex, вот Как я использовал его в этом случае: https://gist.github.com/youroff/8812191758e8df0d69f7d8c94b650b33 –

Смежные вопросы