LLLit: Изучение и практика программирования

Почему функция Ecto cast не преобразует целое число в строку?

У меня есть схема Ecto, которая включает field :owned_by_id, :string. Я объявил поле строкой, потому что мне нужно поддерживать такие значения, как «abc123», а также такие значения, как «123».

В документах для cast / 3 говорится:

Второй аргумент - это карта параметров, которые приводятся в соответствии с информацией о типе из data.

В моем модуле я определяю changeset как:

def changeset(struct, params \\ %{}) do
  cast(struct, params, [:owned_by_id])
end

Когда я это сделаю:

MyModule.changeset(%MyModule{}, %{owned_by_id: 1})

... Я ожидал, что cast превратит этот owned_by_id целочисленный параметр в строку на основе объявления field.

Однако вместо этого я получаю набор изменений, который включает

errors: [owned_by_id: {"is invalid", [type: :string]}]

Я мог бы позвонить Integer.to_string(1) сам, но не должен cast с этим справиться? Есть ли способ сделать так, чтобы он справился с этим автоматически?

15.11.2016

Ответы:


1

Хотя в документации действительно сказано, что параметры «приводятся в соответствии с информацией о типе», Ecto не реализует приведение для Integer -> String. Я предполагаю, что это потому, что это редко требуется, в то время как преобразование String -> Integer полезно, когда ввод отправляется через веб-форму, где все поля поступают в виде строк.


Вы можете создать собственный тип, если хотите такое преобразование. В документации есть пример настраиваемого типа, который реализует нечто подобное: https://github.com/elixir-ecto/ecto/blob/d40008db48ec26967b847c3661cbc0dbaf847454/lib/ecto/type.ex#L29-L40

Ваш тип будет выглядеть примерно так:

def type, do: :string

def cast(integer) when is_integer(integer) do
  {:ok, Integer.to_string(integer)}
end
def cast(string) when is_binary(string), do: {:ok, string}
def cast(_), do: :error

...

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

15.11.2016
  • Похоже на ошибку. 17.11.2016

  • 2

    Если вам нужно решение plug and play, вы можете использовать этот шестнадцатеричный пакет, который я создал. https://github.com/luizParreira/ecto_cast_to_string

    23.05.2017
    Новые материалы

    Как развивается смешанно-целочисленное программирование, часть 7
    Унифицированная техника раннего завершения для первично-двойственных алгоритмов в смешанно-целочисленном коническом программировании (arXiv) Автор : Ювэнь Чэнь , Кэтрин Нин , Поль Гулар..

    Как научить модель Keras распознавать текст переменной длины
    Я некоторое время играл с официальным примером Keras image_ocr.py и хочу поделиться своими выводами в этом посте. В официальном примере выполняется только обучение модели, но отсутствует..

    Практическая пакетная нормализация
    История начинается после использования инициализации He вместе с ELU (или любым вариантом ReLU) может значительно снизить опасность проблем с исчезающими/взрывающимися градиентами в начале..

    Поэзия онлайн-кодирования: путешествие пикселей и страсти
    В мире, наполненном инновациями, онлайн-обучение программированию становится холстом, на котором обретает форму полотно вашей мечты. Это больше, чем просто создание строк кода; это сродни..

    Обработка изображений с помощью Python - размытие и повышение резкости для начинающих
    Как применить ядра свертки к цветным изображениям? В этой статье мы обсудим, как применять ядра размытия и повышения резкости к изображениям. Эти базовые ядра составляют основу многих более..

    Ограничение скорости в .NET Core 7 Web API
    Что такое ограничение скорости? Ограничение скорости — это процесс, используемый для ограничения количества запросов, разрешенных для определенного ресурса в указанном временном окне. .NET..

    Стабильная Diffusion 1.0 выдаёт более красивые картинки, чем SD 2.1?! Почему?
    Удивительные открытия, которые я сделал недавно. Смотрите в видео: https://youtu.be/PakgD6FewoU Есть одно логичное объяснение — что у вас?