如何访问 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)