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
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
0
Popular in Questions
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
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
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
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
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
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
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
Hi folks,
Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
New
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
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
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
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
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
Latest Ash Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









