如何访问 Elixir 中的当前模块
How to access current module in Elixir
假设我有一个模块 MyApp.User
,它有以下方法:
def update_some_counter(user) do
from(u in MyApp.User , where: u.id == ^user.id)
|> Repo.update_all(inc: [some_counter: 1])
end
有没有办法将上面代码中的 MyApp.User
更改为某种检索当前模块的方法?
您可以使用特殊形式 __CALLER__
来访问调用模块的名称。
您可以使用__MODULE__
,编译时会用封闭模块的名称替换。
帕特里克的回答是正确的:你可以使用__MODULE__
。但是,我会建议模型中的所有查询函数都将查询作为参数接收(参见此处:http://blog.drewolson.org/composable-queries-ecto/)并且不要在模型中调用存储库。
将调用存储库的行为(这是一个副作用)留给集成层,例如控制器等等。
您也可以为封闭模块起别名,例如:
defmodule MyApp.User
alias MyApp.User
...
some_function(User)
然后直接引用User
。 shorthand 的别名是这样的 __MODULE__
:
defmodule MyApp.User
alias __MODULE__
...
some_function(User)
假设我有一个模块 MyApp.User
,它有以下方法:
def update_some_counter(user) do
from(u in MyApp.User , where: u.id == ^user.id)
|> Repo.update_all(inc: [some_counter: 1])
end
有没有办法将上面代码中的 MyApp.User
更改为某种检索当前模块的方法?
您可以使用特殊形式 __CALLER__
来访问调用模块的名称。
您可以使用__MODULE__
,编译时会用封闭模块的名称替换。
帕特里克的回答是正确的:你可以使用__MODULE__
。但是,我会建议模型中的所有查询函数都将查询作为参数接收(参见此处:http://blog.drewolson.org/composable-queries-ecto/)并且不要在模型中调用存储库。
将调用存储库的行为(这是一个副作用)留给集成层,例如控制器等等。
您也可以为封闭模块起别名,例如:
defmodule MyApp.User
alias MyApp.User
...
some_function(User)
然后直接引用User
。 shorthand 的别名是这样的 __MODULE__
:
defmodule MyApp.User
alias __MODULE__
...
some_function(User)