我希望我所有的模特都能
new
返回自定义变更集的便利函数。
类似:
def new(attrs) do
changeset(%__MODULE__{}, attrs)
end
这样,当我需要变更集验证时,我可以调用:
Project.Model.new(%{param1: "param1"})
而不是:
Project.Model.changeset(%Model{}, %{param1: "param1"})
我遇到的问题是,当我实现以下宏时:
defmodule Project.Model do
defmacro __using__(_) do
quote do
use Ecto.Schema
import Ecto.Changeset
def new(attrs) do
changeset(%__MODULE__{}, attrs)
end
end
end
end
…它不起作用,因为埃科
schema "model" do ... end
需要在我的
use Project.Model
语句,否则我将得到一个错误,基本上说我的模块没有定义结构。
我可以简单地将宏限制为
新的
函数并将其放在使用它的模块的中间,但这看起来很混乱。
有什么想法吗?
根据要求,完整代码如下:
再一次,所有这些的目的,是要有模型
使用项目.模型
获得便利功能
新的
接受属性并将其放入
changeset
以便在插入数据库之前对它们进行验证。
正如有些人所说,我所犯的错误是
schema
在我使用之前必须扩展
__MODULE__
在我的宏中,因为尚未定义结构。
项目/用户
defmodule Project.User do
use Project.Model
schema "users" do
field :email, :string
field :first_name, :string
field :last_name, :string
timestamps()
end
def changeset(user, attrs) do
user
|> cast(attrs, [:email, :first_name, :last_name])
|> validate_required([:email, :first_name, :last_name])
end
end
项目/型号.ex
defmodule项目.model do
使用do定义宏
报价做
使用ECT.模式
导入外部变更集
新定义(ATTR)DO
变更集(%模块,属性)
结束
结束
结束
结束