2017-04-21 25 views
0

可以說我有user模型一樣遵循如何處理Phoenix中的嵌入式模式?

schema "users" do 
    field :user_name, :string 
    field :password, :string 
end 

address模型一樣遵循

schema "address" do 
    field :line1, :string 
    field :country, :string 
end 

我使用蒙戈DB數據庫,所以我想JSON格式一樣遵循

{ _id:「dfd」,user_name:「$$$$」,密碼:「xxx」,地址:{line1:「line1」,國家:「印度」}}

1)如何創建和驗證變更集,其中用戶名user模態和國家address模型是必填字段? 2)驗證兩者後如何獲得最終變更集?

回答

1

假設蒙戈適配器的工作方式類似於PostgreSQL的jsonb列:

defmodule User do 
    use Ecto.Schema 
    import Ecto.Changeset 

    schema "users" do 
    field :user_name, :string 
    field :password, :string 
    embeds_one :address, Address 
    end 

    def changeset(model, params \\ %{}) do 
    model 
    |> cast(params, [:user_name, :password] 
    |> cast_embed(:address) 
    |> validate_required(:user_name, :password, :address) 
    end 
end 

defmodule Address do 
    use Ecto.Schema 
    import Ecto.Changeset 

    @primary_key false 
    embedded_schema do 
    field :line1, :string 
    field :country, :string 
    end 

    def changeset(model, params \\ %{}) do 
    model 
    |> cast(params, [:line1, :country]) 
    |> validate_required([:line1, :country]) 
    end 
end 
+0

'changeset.changes'貌似遵循'%{USER_NAME: 「哈日」,密碼: 「****」,地址:# Ecto.Changeset ,valid ?: true>}'但是當我嘗試插入錯誤,例如'協議Enumerable not for #Ecto.Changeset

+0

嘗試將'addess'變更集轉換爲結構在插入之前: cs = User.changeset(%User {},params) 地址= apply_changes(get_change(CS,:地址)) CS = put_change(CS,:地址,地址) –

+0

它用於嵌入式地址文件還'{ \t 「_id」 創建'_id':的ObjectId( 「58fda5c9421aa915beeb6ff4」 ), \t 「地址」:{ \t \t 「國家」: 「testcountry」, \t \t 「_id」:的ObjectId( 「58fda5c9421aa915beeb6ff3」), \t \t 「LINE1」: 「testline1」 \t}, \t 「user_name」:「檢查」, \t「密碼」:「******」 } '是否有任何錯誤我做? –