kamaroly
Is it possible chain read actions Ash
I am trying to DRY my resources. Some actions share logic partially. For example, the following two actions share the same logic except filter by department id.
How can I chain action or call an action inside another action?
read :active do
description "Gets ongoing and future time off requests"
filter expr(status == :approved)
filter expr((starts_at <= today() && ends_at >= today()) || starts_at > today())
end
read :active_by_department do
description "Gets ongoing and future time off requests by department"
argument :department_id, :uuid
filter expr(person.department_id == ^arg(:department_id))
# Repetitive code
filter expr(status == :approved)
filter expr((starts_at <= today() && ends_at >= today()) || starts_at > today())
end
Marked As Solved
kamaroly
Thanks. This worked for me. Below is the answer for someone who might be looking for the same solution in the future.
I extracted the logic into its own preparation
Final results
# What name should I give this action?
read :active do
description "Gets ongoing and future time off requests"
prepare MyApp.Leaves.LeaveRequest.Preparations.FilterActive
end
read :active_by_department do
description "Gets ongoing and future time off requests by department"
argument :department_id, :uuid
filter expr(person.department_id == ^arg(:department_id))
prepare MyApp.Leaves.LeaveRequest.Preparations.FilterActive
end
Preparation implementation
defmodule MyApp.Leaves.LeaveRequest.Preparations.FilterActive do
use Ash.Resource.Preparation
def prepare(query, _opts, _context) do
query
|> Ash.Query.filter((starts_at <= today() && ends_at >= today()) || starts_at > today())
|> Ash.Query.filter(status == :approved)
end
end
4
Also Liked
zachdaniel
Creator of Ash
You can’t “chain” them but you can create a single preparation that contains the logic for each. And then use
prepare Prepararion1
prepare Preparation2
1
Popular in Questions
Hi,
I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
Hello, how can I check the Phoenix version ?
Thanks !
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
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
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
Other popular topics
Hi,
I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
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 have an umbrella app.
Some of the apps inside depend on other apps in the umbrella, unsurprisingly.
I’m writing a test for one of the...
New
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
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 using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
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









