如何使用模块属性动态设置Repo
?
例如,我有staging
和production
envs:
defmodule Test do
@repo "staging"
def repo do
case @repo do
"staging" -> alias MyApp.Schools.staging.Repo, as: SRepo
"production" -> alias MyApp.Schools.prod.Repo, as: SRepo
end
end
end
如果我这样做:Test.repo
我得到:Elixir.MyApp.Schools.staging.Repo
那么,为什么我没有得到我期待的MyApp.Schools.staging.Repo
?
修改
我也尝试过只返回没有别名的模块:
def repo do
case @repo do
"staging" -> MyApp.Schools.staging.Repo
"production" -> MyApp.Schools.prod.Repo
end
end
但是,我得到了Elixir.MyApp.Schools.staging.Repo
答案 0 :(得分:0)
如果你真的想根据控制器函数收到的参数中的值来切换repo(而不是运行应用程序的单独实例的更常见的方式,一个MyApp.Repo
指向暂存和一个指向生产),您可以创建一个函数,只返回基于参数的相应Repo模块,然后在返回值上调用函数。
defmodule MyApp do
def repo("staging"), do: MyApp.Staging.Repo
def repo("production"), do: MyApp.Production.Repo
end
defmodule MyApp.PostController do
...
# env can be "staging" or "production"
def index(conn, %{"env" => env}) do
repo = MyApp.repo(env)
render conn, "index.html", posts: repo.all(Post)
end
end