anagrius

anagrius

Setting an attribute to a calculated value based on a relation

Hi,

I want to set an attribute based on a relation.
In the concrete example:

    create :create do
      primary? true
      accept [:content, :task_id]
      change relate_actor(:user)

      change set_attribute(:workgroup_id, <<THE WORKGROUP THE USER BELONGS TO>>)
    end

I would like not to have to pass workgroup_id as an argument since it can be derived from the user/actor + task_id. A user can be in many workgroups in an organization, and the task is associated with exactly one organization.

I need to store the workgroup_id, since in the system a user can change organizations and it is important that we know which org the item was created for, we cannot rely on looking it up through the user after the point of creation.

Marked As Solved

zachdaniel

zachdaniel

Creator of Ash

In this case, you’d do this with a custom change.

create :create do
  primary? true
  accept [:content, :task_id]
  change relate_actor(:user)

  change fn changeset, context -> 
    Ash.Changeset.before_action(changeset, fn changeset -> 
      actor = context.actor
      task = Ash.Changeset.get_attribute(changeset, :task_id)
      workgroup_id = # look up the workgroup id
      Ash.Changeset.force_change_attribute(changeset, :workgroup_id, workgroup_id)
    end
  end
end

A small note, I’ve shown the inline anonymous function syntax here for brevity, but the best practice is to define a module to contain this logic.

change YourChange

defmodule YourChange do
  use Ash.Resource.Change

  def change(changeset, _opts, context) do
      actor = context.actor
      task = Ash.Changeset.get_attribute(changeset, :task_id)
      workgroup_id = # look up the workgroup id
      Ash.Changeset.force_change_attribute(changeset, :workgroup_id, workgroup_id)
  end
end

Where Next?

Popular in Questions Top

baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New

Other popular topics Top

grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54006 488
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

We're in Beta

About us Mission Statement