firesidewing

firesidewing

Simple relationship managing with liveview

I’m warry of getting involved with Ash due to the abstraction it represents, but i wanted to give it a chance since it seems cool and interesting.

I have a couple of small side projects i manage and wanted to try to duplicate one of the simple ones (basically just CRUD with real time updates, a search function, and some user roles stuff). I’m getting stuck on the basics of managing relationships, I’m not sure how much “magic” to expect or what i need to be doing myself but i can’t seem to get the right incantation to get everything working. Granted, I haven’t been able to put much time into this, but I’ve been running through the docs and feel like i’m stuck in a loop.

I have two resources Contacts and Partners. Partners has a one to many with Contacts.

defmodule AshRevenueGenerator.Partners.Contact do
...
actions do
    defaults [:read, :destroy, update: :*]

    create :create do
      primary? true
      accept [:created_by_user_id]

      change relate_actor(:created_by_user)
    end
  end

...

relationships do
    belongs_to :partner, AshRevenueGenerator.Partners.Partner do
      allow_nil? false
      attribute_writable? true
      public? true
    end

    belongs_to :created_by_user, AshRevenueGenerator.Accounts.User do
      allow_nil? false
      attribute_writable? true
    end
  end
...
end

And for the form, I’m just using the one from the generator, with an added select input for the Partner. The public? true on the attributes and the relationship got me for a while, kind of annoying, would be nice if there was a short hand for it (might be, i haven’t be able to find it though). I’ve tried set_attribute in the action and adding the partner_id to the accepts, i’ve tried manage_relationship(:partner, :partner_id) but didn’t stick with that long. I can’t seem to get all the attributes to save for a contact and then to also be able to set the partner from the form at the same time. Current error the form is giving me is that partner is required (which is true but i’m passing in params with a partner_id set)

Long winded, but is there some sort of guide, or tutorial, or documentation I’m missing for this? is there a kind of convention for this simple CRUD or is it more just do whatever feels right? Also, apologies if this has already been asked or solved, i’ve been looking everywhere for a way to solve this and haven’t seen something on this basic level but this was kinda close

Marked As Solved

barnabasJ

barnabasJ

Ash Core Team

You only accept the created_by_user_id at the moment, you also need to accept the partner_id and you probably don’t need to accept the created_by_user_id attribute because you don’t pass that directly but use the actor to set the value.

accept [:created_by_user_id, :partner_id]

You don’t need manage_relationship if you set the ids directly.

There is a section in the getting started guide that shows this, it’s using an update action but otherwise it works the same way Get Started — ash v3.29.3

There is also this section about using manage_relationship Relationships — ash v3.29.3

You can also do everything manage_relationship and more using before/after action hooks.

Also Liked

firesidewing

firesidewing

Ah yeah, definitely remember reading those, that works just fine thank you!

Am I still able to use that :* trick in the accept parameters for an action, or the default_accept? It was handy to have but since my create/update actions handle a relationship i don’t think i can do the defaults [:read, :destroy, create: :*, update: :*]

barnabasJ

barnabasJ

Ash Core Team

I think it should work. :* stands for all public attributes, and the belongs_to definition adds a public attribute if the relationship is public.

Where Next?

Popular in Questions Top

electic
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
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
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
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New

Other popular topics Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 55125 245
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
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
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40165 209
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44778 311
New

We're in Beta

About us Mission Statement