Inserting model with association using create functions

menu = Cms.Content.create_menu(%{name: "Test Menu"})

What’s returned from Cms.Content.create_menu/1? Is it {:ok, menu}?


I would probably avoid casting foreign keys in changesets (can open you up for vulnerabilities if attrs come from user input), but pass them to the create function “manually”.

@spec create_menu_item(map, for: %Menu{}) :: {:ok, %MenuItem{}} | {:error, Ecto.Changeset.t()}
def create_menu_item(attrs, for: %Menu{id: menu_id}) do
  %MenuItem{menu_id: menu_id}
  |> MenuItem.changeset(attrs)
  |> Repo.insert()
end

# for menu item
def changeset(%MenuItem{} = menu_item, attrs) do
  menu_item
  |> cast(attrs, [:name])
  # |> put_assoc(:menu, [attrs.menu])
  |> validate_required([:name, :menu])
  |> unique_constraint(:name, message: "Name is already taken.")
  |> unique_constraint(:order, message: "Order number is already taken.")
end

Usage

{:ok, %Menu{} = menu} = create_menu(%{name: "Test Menu"})
{:ok, %MenuItem{} = menu_item} = create_menu_item(%{name: "Test Item"}, for: menu)