2016-11-15 4 views
3

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

docs for cast/3 говорят:

Второй аргумент представляет собой карту Params, что отлиты в соответствии с информацией типа от 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 справиться с этим? Есть ли способ заставить это обрабатывать это автоматически?

ответ

3

Хотя в документах указано, что параметры «отлиты в соответствии с информацией о типе», 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 

... 

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

+0

Звучит как ошибка. –