2015-01-21 12 views
5

Khi tải các kiểu ngày/giờ từ cơ sở dữ liệu, Ecto sẽ chuyển sang kiểu Ecto.DateTime. Làm thế nào các đúc loại tương tự có thể được áp dụng khi tải một mô hình từ một chuỗi JSONCách nhập JSON giải mã JSON như thể nó xuất phát từ cơ sở dữ liệu

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} 

Trả lời

6

Nếu bạn đang sử dụng Ecto 0.6.0, cách tốt nhất là sử dụng changesets:

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

Sử dụng changeset là thực sự được đề xuất nếu bạn nhận được dữ liệu này dưới dạng dữ liệu ngoài vì bạn cần truyền, lọc và xác thực dữ liệu này trước khi thêm dữ liệu vào mô hình. Bạn có thể tìm thêm thông tin về chúng in the Ecto introduction và cũng trong tài liệu mô-đun Ecto.Changeset.

Vẫn còn một vấn đề: Ecto không biết cách truyền chuỗi thành datetime. Tuy nhiên, bạn có thể dạy nó cách sử dụng các loại tùy chỉnh. Tôi đã tạo ra một mẫu dưới đây, bạn chỉ cần thực hiện các chức năng đúc:

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

Sau đó, trong schema của bạn:

timestamps type: Rocket.DateTime 

Bạn có thể tìm thêm thông tin trong Ecto.Type tài liệu. Tôi biết chúng ta cần phải cải thiện điều này trong Ecto, tôi nghĩ ít nhất chúng ta cũng có thể phân tích dữ liệu theo định dạng được chỉ định trong JSON.

+0

cảm ơn liên kết đến các loại tùy chỉnh, đây vẫn là phương pháp ưu tiên nếu dữ liệu được tin cậy. JSON trong trường hợp này đang được sử dụng để tuần tự hóa/deserialize các mô hình để các chương trình bằng các ngôn ngữ khác nhau có thể làm việc với dữ liệu – Krut

+0

Điều này sẽ làm việc cả hai cách ngay cả khi dữ liệu được tin cậy. :) Vì vậy, bạn tốt. –

+0

là điều này vẫn còn hợp lệ, diễn viên trả về một changeset mà tôi sau đó cần phải áp dụng để có được chế độ, có vẻ đắt tiền 'Ecto.Changeset.cast (Poison.decode! (Dữ liệu),% Rocket.User {}, ~ w (required_fields) , ~ w (optional_fields)) |> Ecto.Changeset.apply_changes' – Krut

Các vấn đề liên quan