2015-01-21 4 views
5

데이터베이스에서 날짜/시간 유형을로드 할 때 Ecto는 Ecto.DateTime 유형으로 캐스팅합니다. 변경 집합이 사용타입 캐스트 JSON을 데이터베이스에서 온 것처럼 디코딩

Ecto.Changeset.cast Poison.decode!(data), %Rocket.User{}, 
        ~w(required_fields), ~w(optional_fields) 

: 당신이 체외 0.6.0을 사용하는 경우 JSON 문자열

defmodule Rocket.User do 
    use Rocket.Model 

    schema "users" do 
    field :created_at, :datetime 
    field :name, :string 
    field :email, :string 
    field :password, :string 
    field :timezone, :string 
    end 
end 

iex(40)> Poison.decode!(~s({"created_at":"2015-01-21T06:05:10.891Z"}), as: Rocket.User) 
%Rocket.User{created_at: "2015-01-21T06:05:10.891Z", email: nil, id: nil, 
name: nil, password: nil, timezone: nil} 

답변

6

에서 모델을로드 할 때 어떻게 같은 종류의 캐스팅을 적용 할 수있는 가장 좋은 방법은 변경 집합을 사용하는 것입니다 이 데이터를 모델에 추가하기 전에이 데이터를 캐스팅, 필터링 및 유효성 검사해야하므로 외부 데이터로 수신하는 경우 실제로 권장됩니다. 자세한 내용은 in the Ecto introductionEcto.Changeset 모듈 설명서를 참조하십시오.

Ecto는 문자열을 datetime으로 변환하는 방법을 알지 못합니다. 그러나 사용자 정의 유형을 사용하여 방법을 가르쳐 줄 수는 있습니다. 난 당신이 바로 캐스팅 기능을 구현해야 템플릿 아래 만들었습니다

다음

https://gist.github.com/josevalim/1ed574b388c32f056da1

스키마에 :

timestamps type: Rocket.DateTime 

당신은 Ecto.Type 문서에서 더 많은 정보를 찾을 수 있습니다. Ecto에서 이것을 향상시켜야한다는 것을 알고 있습니다. 적어도 JSON에 지정된 형식으로 datetime을 파싱 할 수 있어야한다고 생각합니다.

+0

사용자 정의 유형에 대한 링크 덕분에 데이터를 신뢰할 수있는 경우 여전히이 방법을 사용하는 것이 좋습니다. 이 경우 JSON은 모델을 직렬화/비 직렬화하여 다른 언어의 프로그램이 데이터와 함께 작동 할 수 있도록 사용됩니다. – Krut

+0

데이터가 신뢰할 수있는 경우에도 두 방법으로 모두 작동합니다. :) 그럼 너 괜찮아. –

+0

이것은 여전히 ​​유효합니다. 캐스트는 리턴 값으로 변경 모드를 적용해야합니다. 값 비싼 Ecto.Changeset.cast (Poison.decode! (data), % Rocket.User {}, ~ w (required_fields) , ~ w (optional_fields)) |> Ecto.Changeset.apply_changes' – Krut

관련 문제