andreh
Overriding prefix from `Repo.default_options/1`
Hi! First, I’d like to thank the Ash team. Ash solves so many problems! I’m planning to incrementally migrate my whole app to it.
I’ve got one problem, though. My app uses schema-based multitenancy and the Process dictionary to store the tenant_id, and default_options/1 to automatically put the right schema prefix for all queries.
defmodule App.Repo do
use AshPostgres.Repo,
otp_app: :app
@tenant_key {__MODULE__, :tenant_id}
def default_options(_opts) do
case get_tenant_id() do
nil -> []
tenant_id -> [prefix: "tenant_#{tenant_id}"]
end
end
def put_tenant_id(tenant_id) when is_integer(tenant_id) do
Process.put(@tenant_key, tenant_id)
end
def get_tenant_id do
Process.get(@tenant_key)
end
end
This is not a problem for the multitenant Ash Resources. But when I try to create global Ash Resources, they are scoped to the current tenant’s schema. I’ve tried something like this:
postgres do
repo App.Repo
table "settings"
schema "public"
end
But schema "public" doesn’t seem to translate to a prefix: "public" passed to Ecto that would override the default option. It also creates a new migration with a “public” prefix.
How could I tell Ash to set a prefix for Ecto’s Repo?
Marked As Solved
andreh
Wow, that was fast! I totally agree that using the process dictionary is not the best pattern. Unfortunately, my codebase is rather big, and I can’t make a big bang change right now.
Thanks for your answer. I’ve tried it using the main branch of Ash, but unfortunately the prefix still wasn’t set. So I ended doing a bigger refactoring: I’ve renamed Repo to TenantRepo and the added a Repo module for Ash and other non-tenant operations. This is much cleaner: no need to pass prefix: "public" as Repo never uses the process dictionary.
Popular in Questions
Other popular topics
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









