Nano Hash - криптовалюты, майнинг, программирование

Изменить первую связанную запись в наборе изменений

Есть ли способ изменить только первый элемент в отношениях с помощью набора изменений? Ака если бы у меня было:

  • 1 account с N emails

s можно сделать что-то вроде:

schema "accounts" do 
    ...
    has_many(:emails, StockrtApi.Accounts.Email)
end

def changeset(account, params) do
    account
    ...
    |> cast_assoc(:emails, required: true, with: &Email.changeset(&1, &2))
    |> put_change(first_email_only, {primary: true}) # <- might have to go in email schema
end

Или как лучше всего подойти к этому типу проблемы?


Ответы:


1

При работе с базами данных не следует полагаться на порядок чего-либо (если только не представлено явное предложение ORDER BY). Хотя большинство драйверов баз данных будут возвращать предсказуемый упорядоченный набор без явного предложения ORDER BY, это никоим образом не гарантируется. Тем не менее, всегда лучше предпочесть явность неявности: просто введите еще одну through ассоциацию:

schema "accounts" do 
  ...
  has_many :emails, StockrtApi.Accounts.Email
  has_one :primary_email, through: [:primary_email, :email]
end

И поставить эту ассоциацию с обычным Ecto.Changeset.put_assoc/4.


Согласно комментарию, когда все, что вам нужно, это убедиться, что есть электронное письмо, сделайте именно это:

defp ensure_email(
  %Ecto.Changeset{errors: errors, changes: %{emails: emails}} = changes
) do
  case emails do  
    [] ->
      new_errors = [{:emails, {"can’t be empty", [validation: :emails]}}]
      %{changes | errors: new_errors ++ errors, valid?: false}
    _ -> changes
  end
end

и используйте его явно:

def changeset(account, params) do
  account
  ...
  |> cast_assoc(:emails, required: true, with: &Email.changeset(&1, &2))
  |> ensure_email()
end

Таким образом вы гарантируете наличие хотя бы одного электронного письма — просто используйте первое как primary.

18.06.2018
  • На самом деле меня не волнует порядок каждого сообщения, я просто пытаюсь убедиться, что, когда я вставляю письмо в первый раз (т. е. кто-то подписывается), 1 из их электронных писем устанавливается в качестве основного (и только 1). Но, основываясь на вашем комментарии, я думаю, что эта логика была бы более уместной в контексте? Или, может быть, схема счета? 19.06.2018
  • Если вас не волнует порядок, то я вообще не вижу смысла в этой ассоциации. Просто убедитесь, что :emails assoc не пуст. 19.06.2018
  • Обновил ответ. 19.06.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование