Состав состоит из того, что что-то состоит из отдельных частей и имеет прочные отношения с этими частями. Если основная часть умирает, так и другие, у них не может быть собственной жизни. Грубым примером является человеческое тело. Выньте сердце, и все остальные части отмирают.
Наследование - это то, где вы просто берете то, что уже существует и использует его. Нет сильных отношений. Человек мог наследовать свое отцовское имение, но он может обойтись без него.
Я не знаю Java, поэтому я не могу представить пример, но я могу дать объяснение понятий.
Если поле не требуется, вы должны удалить его из validate_required .
Таким образом, ваша функция изменения должна стать
def changeset(%User{} = user, attrs) do
user
|> cast(attrs, [:email, :cpf, :name, :phone_number, :password])
|> validate_required([:email, :password])
|> validate_format(:email, ~r/^[A-Za-z0-9._%+-+']+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/)
|> validate_format(:cpf, ~r/([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})/)
|> validate_cpf(:cpf)
|> unique_constraint(:email)
|> unique_constraint(:cpf)
|> unique_constraint(:phone_number)
|> update_password_hash()
|> update_activation_code()
end
Все, что вам нужно сделать, это изменить вызов на метод validate_required
, чтобы удалить поля, которые вы хотите сделать необязательными:
|> validate_required([:email, :password])
Если вы хотите узнать больше о том, что делают эти вызовы функций, Вы можете прочитать руководство по фениксной структуре об Ecto (в частности, раздел Changesets and Validations ).