2016-04-26 8 views
1

私は、データベースからレコードを取得するための汎用ローダーを持っている:エリクシールの親モジュールにアクセスするには?

defmodule Loader do 
    defmacro __using__(opts) do 
    quote location: :keep, bind_quoted: [schema: opts[:schema]] do 

     def one(id), do: unquote(schema) |> Repo.get(id) 
     def all,  do: unquote(schema) |> Repo.all 
    end 
    end 
end 

特にローダーあちこちに固有のスキーマ:

defmodule Location.Loader do 
    use Loader, schema: Location 
end 

は、いくつかの「使用」のモジュールと通信する方法はあります他の方法__MODULE__.parent

+1

あなたは何をしたいですか?他のモジュールと同様に、モジュールを名前で参照できます。 – Gazler

+1

あなたがしようとしていることは、少し複雑すぎます。私はまた、あなたが何を達成しようとしているのか知りたいと思います。 – tkowal

+0

ご覧のとおり、 'Loader'が使用されているモジュールの" top "モジュールである' Location'に 'Loader'でアクセスしたいと思います。 – squixy

答えて

2

あなたはLoader.__using__quote内部から__MODULE__を使用して、親モジュールを取得するにはModule.split/1Enum.drop/2、およびModule.concat/1を使用することができます。

defmodule Loader do 
    defmacro __using__(opts) do 
    quote location: :keep, bind_quoted: [schema: opts[:schema]] do 
     @parent_module __MODULE__ |> Module.split |> Enum.drop(-1) |> Module.concat 
     def one(id), do: IO.puts("#{@parent_module}:one:#{id}") 
     def all,  do: IO.puts("#{@parent_module}:all") 
    end 
    end 
end 

defmodule Location.Loader do 
    use Loader 
end 

Location.Loader.one 123 
Location.Loader.all 

プリント

Elixir.Location:one:123 
Elixir.Location:all 

しかし、それはより明確だし、私の経験から、より多くの慣用的と考えられて、私はがこれを使用して、元のコードを使用していないをお勧めします。

関連する問題