Mainly learning the Ash way vs the Ecto's.
Defining resource actions and domain code interfaces with arguments is significantly different from writing normal functions. However, the validations and changes feel much easier once you understand them. The best part is conditional validations and changes with the where option that validates all conditions before executing the change or validation.
Query composition moves from just functions to Preparations where you can do the same style of function head pattern matching. Same can be said for custom Changes and Actions.
Managing relationships is made way easier in Ash. Instead of doing put_assoc, you can put the manage_relationship change and specify what should happen when adding the relationship. Like create if one doesn't exist, relate when it does exist, or remove and add a new one.
Still not fully clear on how to compose actions by leveraging Hooks like before_action, after_action, before_transaction, after_transaction to replace Ecto.Multi uses or leverage Notifiers for async actions. But, I've mostly been able to replace Ecto.Multi uses with manage_relationship for my use cases. Planning to dive into Notifiers soon for writing to an action logs table.
The main challenge of learning the framework has been a lack of search-ability as opposed to Ecto. That's just due to the framework being young. However, you can learn a ton with the documentation, Discord, Elixir Forum, and using references like
github.com/team-alembic/real….
I'm still actively learning the framework and figuring things out. I constantly go from "Why isn't this working???? I could just write a function or use the Ecto way" and then when it finally works "Holy crap! It was that simple?! This is awesome."