Hacker News new | ask | show | jobs
by mike1o1 333 days ago
I guess, but you'll be writing a _lot_ of code yourself, that might be hard to maintain and can become brittle overtime as requirements evolve.

As an example, I wanted to add support for adding tags to a resource, and support filtering for the resource by the tag, and I wanted to be able to do this filtering both through Elixir functions as well as GraphQL.

Can I do this with Ecto? Absolutely, but I'd have to build it all myself.

With Ash, I created a `Tag` and `Tagging` resource, adding a `many_to_many` block on my resource, marked it as public. Then I added the `AshGraphql.Resource` extension to my `Tag` resource, marked it as filterable and I was done.

Now I can filter and sort by tags, filter by where tags _don't_ exist and more. I didn't have to do anything other than model my domain, and Ash took care of the rest for me. Not only that, but it probably did a lot of things for me that I probably wouldn't have thought of, such as supporting multi-tenancy, policies and more.

It really is a lovely tool, I can't say enough good things about it.

Does it have a learning curve? Absolutely! Is it worth overcoming it? Again, absolutely!

1 comments

Ah. Looks like I'll have to get the Ash book...
Chiming in to recommend it too! The policies are really good too, for instance this is one from our code base:

    policy action(:invite_user) do
      forbid_unless actor_attribute_equals(:role, :admin)
      authorize_if {App.Checks.OnlyAllowedRoles, roles: [:student, :parent]}
    end
And what's nice is that these policies apply for both the API and the frontend code without having to do anything extra :)