I don’t believe there is a specific example or guide for that with ash_admin. When you say that you are unable to manage the many to many relationship, what happens when you try to do so? Is it just not showing in the UI? Can you show me the action in question?
EDIT: I think the issue is simpler than I realized, after rereading your question. Answer below:
Actions do not accept related data by default. You have to add an argument (the way to accept non-attribute values into an action), and then you have to use that argument. The most straightforward way to do so, and the way that tells ash_admin to generate proper inputs, is with the builtin manage_relationship change. For example:
update :update do
argument :users, {:array, :map}
change manage_relationship(:users, type: :append_and_remove)
end
In ash_admin (User → Create/Edit), the “Offices” field renders as a plain nested input:
Offices
Id [__________]
So it looks like it expects office IDs (UUIDs) rather than a select/typeahead using Office.label_field.
you can use the label_field option on a resource, which will make it appear with a dropdown/typeahead in the admin interface for anything with relationships that point to it:
Thanks a lot for the hint! Sorry if I’m still missing something basic here.
I tried setting label_field on the related resource, but in AshAdmin the field still renders as an “IDs-only” nested input (no select/typeahead).
Office:
admin do
label_field :name
relationship_select_max_items 10
end
User:
relationships do
has_many :memberships, Manager.Accounts.Membership
many_to_many :offices, Manager.Org.Office do
through Manager.Accounts.Membership
source_attribute_on_join_resource :user_id
destination_attribute_on_join_resource :office_id
end
end
admin do
label_field :cip
form do
field :cip, type: :default
field :name, type: :default
field :offices, type: :default
end
end
actions do
defaults [:read, :destroy]
create :create do
accept [:cip, :name]
argument :offices, {:array, :map}, allow_nil?: true, default: []
change manage_relationship(:offices, type: :append_and_remove)
end
update :update do
accept [:cip, :name]
require_atomic? false
argument :offices, {:array, :map}, allow_nil?: true, default: []
change manage_relationship(:offices, type: :append_and_remove)
end
read :get_by_subject do
description "Get a user by the subject claim in a JWT"
argument :subject, :string, allow_nil?: false
get? true
prepare AshAuthentication.Preparations.FilterBySubject
end
end
Is this expected currently? Or is there some AshAdmin configuration I’m missing to force a relationship selector for a many_to_many managed via manage_relationship?
hmm…maybe there is a bug? It might not work for many to many relationships? I would have expected it to though… Can you create a reproduction project and push it up?
It only includes User, Office and Membership (many_to_many through join), plus AshAdmin.
In AshAdmin, in User create/update, the offices field still renders as an “Id [uuid]” nested input instead of a relationship selector (dropdown/typeahead) even with: