Проблема с предварительной загрузкой ассоциации в эликсире - PullRequest
1 голос
/ 30 октября 2019

У меня есть схема банка и филиала. Таким образом, у банка много филиалов, но когда я создаю банк, он должен получить идентификатор филиала и его данные.

схема банка

defmodule Banking.Schema.Bank do
  use Ecto.Schema
  import Ecto.Changeset
  alias Banking.Schema.Branch

  schema "banks" do
    field :name, :string
    has_many :branches, Branch

    timestamps()
  end

  def changeset(bank, attrs) do
    bank
    |> cast(attrs, [:name])
    |> validate_required([:name])
    |> Repo.preload(:branches)
  end
end

схема ветви

defmodule Banking.Schema.Branch do
  use Ecto.Schema
  import Ecto.Changeset
  alias Banking.Model.Bank, as: BankModel
  alias Banking.Schema.Bank

  @primary_key {:ifsc, :string, []}

  schema "branches" do
    field :branch, :string
    field :address, :string
    field :city, :string
    field :district, :string
    field :state, :string
    belongs_to :bank, Bank

    timestamps()
  end

  def changeset(branch, attrs) do
   branch
    |> cast(attrs, [:ifsc, :branch, :address, :city, :district, :state])
    |> validate_required([:ifsc, :branch, :address, :city, :district, :state])
    |> put_assoc(:bank, attrs["bank"])
  end
end

Как вы видите для схемы филиала, я создал первичный ключ для кода ifsc.

Итак, я хочу, чтобы я создал ревизию для банка. Я хочу получить подробную информацию о ветке с помощью ifsc-кода.

bank = Bank.changeset(%Bank{}, %{name: "sbi", branch: "122"})

Вот так, но сейчас я не могу предварительно загрузить ветку.

1 Ответ

0 голосов
/ 30 октября 2019

Вы не можете предварительно загрузить changeset, они используются для проверки правильности ограничений, и это происходит до того, как запись извлечена / вставлена. Если вы посмотрите на документацию Repo.preload :

Предварительно загружает все ассоциации на данную структуру или структуры.

Это похоже на Ecto. Query.preload / 3, за исключением того, что он позволяет предварительно загружать структуры после того, как они были извлечены из базы данных .

Что вам нужно сделать в своем коде, это сначала получить / вставитьнабор изменений в базу данных, а затем предварительно загрузить структуру результата (удалить Repo.preload из набора изменений):

Bank.changeset(%Bank{}, %{name: "sbi"})
|> Repo.insert() # here you get the struct of the inserted record
|> Repo.preload(:branches)
...