-
Notifications
You must be signed in to change notification settings - Fork 146
Open
Description
ExMachina's EctoStrategy is incompatible with Ecto schemas that use polymorphic_embeds_one or polymorphic_embeds_many from the polymorphic_embed library. Attempting to use insert/2 with such schemas results in a runtime error.
** (RuntimeError) Elixir.PolymorphicEmbed must not be casted using Ecto.Changeset.cast/4,
use Elixir.PolymorphicEmbed.cast_polymorphic_embed/2 instead.
Schema Definition
defmodule MyApp.Document do
use Ecto.Schema
import PolymorphicEmbed
schema "documents" do
field :title, :string
# Polymorphic embed field
polymorphic_embeds_one :content,
types: [
text: MyApp.TextContent,
image: MyApp.ImageContent,
video: MyApp.VideoContent
],
on_type_not_found: :raise,
on_replace: :update
end
def changeset(document, attrs) do
document
|> Ecto.Changeset.cast(attrs, [:title])
|> cast_polymorphic_embed(:content) # Required for polymorphic embeds
end
end
defmodule MyApp.TextContent do
use Ecto.Schema
embedded_schema do
field :body, :string
end
endFactory Definition
defmodule MyApp.Factory do
use ExMachina.Ecto, repo: MyApp.Repo
def document_factory do
%MyApp.Document{
title: "Test Document",
content: %MyApp.TextContent{body: "Sample text"}
}
end
endTest That Fails
defmodule MyApp.DocumentTest do
use MyApp.DataCase
import MyApp.Factory
test "creates document" do
# This raises the PolymorphicEmbed error
document = insert(:document)
assert document.title == "Test Document"
end
endCopilot
Metadata
Metadata
Assignees
Labels
No labels