将Repo分配给模块属性?

时间:2017-09-12 09:38:46

标签: elixir phoenix-framework

如何使用模块属性动态设置Repo? 例如,我有stagingproduction 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

1 个答案:

答案 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