dmitriid

dmitriid

At one point I’ll wrap my head around the new changes to resource attributes in Ash, I promise :slight_smile:

Meanwhile here’s an issue I have:

module Quire.Blog.Page do
  actions do
    defaults [
      :read,
      :destroy,
      create: [
        :title,
        :slug,
        :raw,
        :rendered,
        :is_published,
        :published_at,
        :is_tag,
        :toc,
        :settings,
        :is_archived,
        :is_private,
        :show_on_timeline,
        :language
      ]
    ]
    action :duplicate, :struct do
      argument :page_id, :uuid
      transaction? true

      run fn query, _context ->
        id = query.arguments.page_id

        {:ok, page} =
          __MODULE__.get(id)
          |> Ash.load([:media, :tags, :pages, :external_scripts])

        new_page = %{
          page
          | id: nil,
            is_published: false,
            published_at: nil,
            slug: nil,
            is_private: false
        }

        {:ok, new_page} = new_page |> Map.from_struct() |> __MODULE__.create()
        ...
    end
end

This action will fail in create because the input will have quite more fields than just listed attributes: it will have all the calculated fields, and all the aggregations etc.

This worked in Ash 2.x, but now fails in Ash 3.0 with %Ash.Error.Invalid.NoSuchInput for every calculation, aggregate etc. in the provided map.

Is their a fast way to convert this into a proper changeset with inputs. E.g. by filtering only on keys available to the action?

Showing Posts 1 to 2

dmitriid

dmitriid OP

I’ve solved it by

        new_page =
          page
          |> Map.from_struct()
          |> Map.take(@create_attributes)

        new_page = %{
          new_page
          | is_published: false,
            published_at: nil,
            slug: nil,
            is_private: false
        }

        {:ok, new_page} = new_page |> __MODULE__.create()

where @create_attributes contains all the necessary fields

zachdaniel

zachdaniel

Creator of Ash

You can also tell Ash what keys to ignore in cases that they are missing:

inputs = new_page |> Map.from_struct()
{:ok, new_page} =  __MODULE__.create(inputs, skip_unknown_inputs: Map.keys(inputs))

With that said, being more explicit as you are showing is always better :+1:

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
ryanwinchester
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted” Version...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews