2017-02-16 2 views
0

У меня есть две таблицы, скажем, например. Оплата и возврат с транзакционным_идом в качестве внешнего ключа для возврата.ошибка в ассоциациях using own_to

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

Можете ли вы добавить полное точное сообщение об ошибке? Одна из проблем, которую я вижу, заключается в том, что вы не определили 'foreign_key' для свойства belongs_to. Вероятно, вы хотите 'принадлежит_от: платеж, Payments.Payment, foreign_key:: transaction_id, ссылки:: transaction_id', так как вы хотите подключить поля транзакции двух таблиц. – Dogbert

+0

Спасибо @Dogbert, но теперь я получаю эту ошибку. * (Ecto.ChangeError) значение '# Ecto.Association.NotLoaded <ассоциация: transaction_id не загружается>' for 'Payments.Refund.transac имя_события' 'insert' не соответствует типу: id –

+0

Также я получаю эта ошибка, при попытке отката ошибки: [transaction_id: {"is invalid", [type:: id, validation:: cast]}], –

ответ

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].

+0

Благодарим за ваш ответ @patNowak, но как можно оплатить есть много возврата, есть одна транзакция и может иметь либо возврат, либо возврат средств вообще. поэтому он должен быть has_one, однако я просто хочу связать таблицу возврата с оплатой, когда там есть возмещение за любую транзакцию, которая является задним корпусом, а не каждый раз, когда мне придется возвращать транзакцию, поэтому используется belongs_to в схеме возврата , has_many не является опцией –

+0

Поэтому вы должны использовать этот 'has_one' для' Refund'. – PatNowak

Смежные вопросы