2016-08-23 9 views
9

मैं वास्तव में एक बदलाव के साथ एक एसोसिएशन सेट करने के तरीके में थोड़ा फंस गया हूं। मैं अपने मॉडल में इस कोड है:Elixir Ecto: एक परिवर्तनसेट में एक related_to एसोसिएशन कैसे सेट करें

defmodule MyApp.MemberApplication do 
    use MyApp.Web, :model 
    use Ecto.Schema 
    use Arc.Ecto.Schema 

    alias MyApp.Repo 
    alias MyApp.MemberApplication 

    schema "applications" do 
    field :name, :string 
    field :email, :string 
    field :time_accepted, Ecto.DateTime 
    field :time_declined, Ecto.DateTime 
    belongs_to :accepted_by, MyApp.Admin 
    belongs_to :declined_by, MyApp.Admin 

    timestamps() 
    end 

    def set_accepted_changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:time_accepted, :accepted_by_id]) 
    |> cast_assoc(params, :accepted_by) 
    |> set_time_accepted 
    end 

    defp set_time_accepted(changeset) do 
    datetime = :calendar.universal_time() |> Ecto.DateTime.from_erl 
    put_change(changeset, :time_accepted, datetime) 
    end 
end 

मैं Admin कि एक निश्चित कार्रवाई (स्वीकार करने या एक member_application गिरावट) के एक संघ और एक टाइमस्टैम्प सहेजना चाहते हैं। टाइमस्टैम्प की पीढ़ी काम करता है लेकिन जब मैं एक संघ को बचाने की कोशिश मैं हमेशा त्रुटि

** (FunctionClauseError) no function clause matching in Ecto.Changeset.cast_assoc/3 

प्राप्त इस तरह मैं संघ सेट करना चाहते है:

iex(26)> application = Repo.get(MemberApplication, 10) 
iex(27)> admin = Repo.get(Admin, 16) 
iex(28)> changeset = MemberApplication.set_accepted_changeset(application, %{accepted_by: admin}) 
+7

कोशिश 'Application.set_accepted_changeset (आवेदन,% {accepted_by_id: admin.id})' और '|> cast_assoc (: accepted_by)'। – Dogbert

+0

यह काम किया। एक उत्तर लिखेंगे –

उत्तर

7

धन्यवाद @Dogbert। यह मैं इसे कैसे

defmodule MyApp.MemberApplication do 
    use MyApp.Web, :model 
    use Ecto.Schema 
    use Arc.Ecto.Schema 

    alias MyApp.Repo 
    alias MyApp.MemberApplication 

    schema "applications" do 
    field :name, :string 
    field :email, :string 
    field :time_accepted, Ecto.DateTime 
    field :time_declined, Ecto.DateTime 
    belongs_to :accepted_by, MyApp.Admin 
    belongs_to :declined_by, MyApp.Admin 

    timestamps() 
    end 

    def set_accepted_changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:time_accepted, :accepted_by_id]) 
    # Change cast_assoc 
    |> cast_assoc(:accepted_by) 
    |> set_time_accepted 
    end 

    defp set_time_accepted(changeset) do 
    datetime = :calendar.universal_time() |> Ecto.DateTime.from_erl 
    put_change(changeset, :time_accepted, datetime) 
    end 
end 

काम और फिर संघ को पहले से लोड और आईडी सीधे सेट करने के लिए मिल गया है। या क्वेरी में सीधे कार्य करें:

iex(26)> application = Repo.get(MemberApplication, 10) 
iex(27)> application = Repo.preload(application, :accepted_by) 
iex(28)> admin = Repo.get(Admin, 16) 
iex(29)> changeset = MemberApplication.set_accepted_changeset(application, %{accepted_by_id: admin.id}) 
+0

आपको अपना जवाब स्वीकार करना चाहिए ताकि इसे समाधान के रूप में प्रदर्शित किया जा सके। – kioopi

संबंधित मुद्दे