1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 15:18:01 +00:00

Add Virtual Fields With Ecto Schemas as an elixir til

This commit is contained in:
jbranchaud
2016-11-26 13:25:42 -06:00
parent 31f86b9e4b
commit 4b57eaa04b
2 changed files with 32 additions and 1 deletions

View File

@@ -7,7 +7,7 @@ variety of languages and technologies. These are things that don't really
warrant a full blog post. These are mostly things I learn by pairing with
smart people at [Hashrocket](http://hashrocket.com/).
_487 TILs and counting..._
_488 TILs and counting..._
---
@@ -106,6 +106,7 @@ _487 TILs and counting..._
- [Run ExUnit Tests In A Deterministic Order](elixir/run-exunit-tests-in-a-deterministic-order.md)
- [String Interpolation With Just About Anything](elixir/string-interpolation-with-just-about-anything.md)
- [Updating Values In A Map](elixir/updating-values-in-a-map.md)
- [Virtual Fields With Ecto Schemas](elixir/virtual-fields-with-ecto-schemas.md)
- [Word Lists For Atoms](elixir/word-lists-for-atoms.md)
### Git

View File

@@ -0,0 +1,30 @@
# Virtual Fields With Ecto Schemas
If you'd like to include a particular key-value pair in an Ecto changeset,
it needs to be included as a field in the schema. In the case of something
akin to a password field, you want to be able to perform validations against
it, but the password itself does not have a column in the database. In other
words, you want to use the password in memory as part of the validation
process but not save it to the database. To accomplish this, you need to
specify that it is a `virtual` field.
```elixir
schema "users" do
field :username, :string
field :password_digest, :string
field :password, :string, virtual: true
end
```
With that schema, you can then validate the `:password` and transform it
into the corresponding `:password_digest` field.
```elixir
def registration_changeset(model, params) do
model
|> changeset(params) # do other standard validations
|> cast(params, [:password]) # include :password in the changeset
|> validate_length(:password, min: 8) # validations
|> put_pass_hash() # transform into :password_digest
end
```