defmodule Payments.Payment do
use Payments.Web, :model
schema "payment" do
field :payment_id, :string
field :captured_amount, :decimal
field :transaction_id, :string
timestamps()
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:payment_id, :transaction_id, :captured_amount])
|> validate_required([:payment_id, ::transaction_id, :captured_amount])
end
end
defmodule Payments.Refund do
use Payments.Web, :model
@primary_key {:refund_id, :string, []}
schema "refund" do
field :state, :string
field :pay_id, :string
field :amount, :decimal
field :create_time, Ecto.DateTime
belongs_to :transaction_id, Payments.Payment
timestamps()
end
def changeset(struct, params \\ []) do
struct
|> cast(params, [:refund_id, :state, :transaction_id, :pay_id, :amount, :create_time])
|> validate_required([:refund_id, :pay_id, :amount])
end
end
无法插入退款详细信息,没有功能子句匹配错误。 我认为问题在于变更集,因为我无法使用它。
答案 0 :(得分:0)
当你想建立这样的联想时,你必须记住一些事情:
<强> 1。如果一个模型belongs_to
是另一个模型,则第二个模型has_many
或has_one
。
在您的示例Payments.Payment
中应该有一个Payments.Refund
。
<强> 2。如果您更改架构,首先要更改迁移。
您对表格refunds
的迁移应如下所示:
def change do
alter table(:refunds) do
add :payment_id, :integer
end
end
第3。在Ecto中使用关联时,您必须明确。
Ecto不会预先加载您的关联,您必须告诉您要使用Repo.preload(model, :field)
预加载它们,或者只使用带有preload: [:field]
选项的查询。