使用belongs_to

时间:2017-02-16 18:18:11

标签: elixir phoenix-framework ecto

我有一张两张桌子,比如说使用transaction_id付款并退款作为退款的外键。

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

无法插入退款详细信息,没有功能子句匹配错误。 我认为问题在于变更集,因为我无法使用它。

1 个答案:

答案 0 :(得分:0)

当你想建立这样的联想时,你必须记住一些事情:

<强> 1。如果一个模型belongs_to是另一个模型,则第二个模型has_manyhas_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]选项的查询。