2017-09-12 2 views
0

モジュール属性を使用して、その場でRepoを設定するにはどうすればよいですか?Repoをモジュール属性に割り当てる?

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 

私がしなければ:たとえば 、私はstagingproduction ENVSを持っTest.repo私が手:Elixir.MyApp.Schools.staging.Repoは ので、なぜ私はMyApp.Schools.staging.Repoを期待していたものを持っていないのですか?あなたが本当に価値に基づいてレポを切り替えたい場合は、私はElixir.MyApp.Schools.staging.Repo

+0

これはこのようには機能しません。 ["import/2、require/2、alias/2はディレクティブと呼ばれ、すべてがレキシカルスコープを持っているため、特定の関数の中にエイリアスを設定でき、全体のスコープには影響しません。"](https:// hexdocs .pm/elixir/Kernel.SpecialForms.html#alias/2)なぜこれをやりたいのですか?おそらく、あなたの問題を解決する別の方法があります。 – Dogbert

+0

EDIT boveをチェックしてください。私がやろうとしているのは、要求によって送られたparamに基づいてRepoを選択的に使用することです。つまり、httpリクエストを実行するときにステージングDBとプロダクションDBがあることを確認する必要があります。送信されたパラメータに基づいてDBを選択します。 – simo

+0

多分私がやろうとしているのはアンチパターンですか?ステージングとプロダクションの両方に対して1台のサーバーを持っているのは悪い考えですか? – simo

答えて

0

を得た、

def repo do 
     case @repo do 
      "staging" -> MyApp.Schools.staging.Repo 
      "production" -> MyApp.Schools.prod.Repo 
     end 
     end 

しかし:私もちょうどエイリアスなしに、モジュールを返却しようとした

EDIT

コントローラの機能によって受け取られたパラメータ(別のアプリケーションインスタンスを実行するより一般的な方法ではなく、MyApp.Repoがステージングを指し示すものとproductioを指すものの1つn)では、paramsに基づいて適切な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 
関連する問題