Skip to content

Instantly share code, notes, and snippets.

@lleger
Created October 2, 2019 13:43
Show Gist options
  • Save lleger/91324296b4d34a156cf3844e3aadbedf to your computer and use it in GitHub Desktop.
Save lleger/91324296b4d34a156cf3844e3aadbedf to your computer and use it in GitHub Desktop.
defmodule MySchema do
use Ecto.Schema
import Ecto.Changeset
@type t :: %__MODULE__{}
schema "my_schemas" do
field(:name, :string)
embeds_one(:permissions, MembershipPermissions,
primary_key: false,
on_replace: :update
) do
field(:can_do_stuff, :boolean, default: true)
end
timestamps(type: :utc_datetime)
end
def changeset(schema, attrs) do
schema
|> cast(attrs, [:name])
|> set_default_permissions()
|> cast_embed(:permissions, with: &permissions_changeset/2, required: true)
end
def set_default_permissions(changeset) do
case get_field(changeset, :permissions) do
nil ->
put_embed(changeset, :permissions, %{})
_ ->
changeset
end
end
def permissions_changeset(schema, params) do
schema
|> cast(params, [:can_do_stuff])
|> validate_required([:can_do_stuff])
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment