# Using with ecto
After you finished [Getting Started](./getting_started.md) guide, you
may be interested how to use this library with
[ecto](https://github.com/elixir-ecto/ecto). The general approach is
to link your files to some database entries.
## Defined schema
Suppose we have the following simple schema for users.
```elixir
defmodule MyApp.User do
use Ecto.Schema
alias Ecto.Changeset
schema "users" do
field :username, :string
timestamps()
end
def changeset(user, attrs) do
user
|> Changeset.cast(attrs, [:username])
|> Changeset.validate_required([:username])
end
end
```
And this is the module responsible for busyness logic.
```elixir
defmodule MyApp.UserQueries do
alias MyApp.{Repo, User}
def create(attrs) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end
end
```
## Adding avatars to the schema
Now we want to be able to attach avatars. First we add `:string` field
to the schema and modify `MyApp.User.changeset/2` function.
```elixir
defmodule MyApp.User do
use Ecto.Schema
alias Ecto.Changeset
schema "users" do
field :username, :string
field :avatar, :string
timestamps()
end
def changeset(user, attrs) do
user
|> Changeset.cast(attrs, [:username, :avatar])
|> Changeset.validate_required([:username, :avatar])
end
end
```
## Handling avatar uploading
Then we add image processing logic to `MyApp.UserQueries`.
```elixir
defmodule MyApp.UserQueries do
alias MyApp.{Repo, User}
def create(attrs) do
with {:ok, filename} <- handle_image(attrs) do
do_create(%{attrs | "avatar" => filename})
end
end
# This function is responsible for actual image uploading.
defp handle_image(%{"avatar" => %Plug.Upload{path: path}}) do
%{filename: filename} = file = IVCU.File.from_path(path)
with {:ok, _} <- IVCU.save(file, MyApp.Image) do
{:ok, filename}
end
end
defp handle_image(_) do
{:error, :avatar_is_missing}
end
# Here we moved actual call database interaction into a separate
# function.
defp do_create(attrs) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end
end
```
> #### Warning {: .warning}
>
> Of cause you can implement more sophisticated validations on the
> input. The code above provided for demonstration purposes only.