我已經成員,列表項和記憶定義爲多重嵌套的變更如下:如何生成cast_assoc
schema "lists" do
has_many :itemlists, Learnit.Itemlist, on_delete: :delete_all
many_to_many :items, Learnit.Item, join_through: Learnit.Itemlist
has_many :memberships, Learnit.Membership, on_delete: :delete_all
end
schema "memberships" do
belongs_to :list, Learnit.List
has_many :memorys, Learnit.Memory, on_delete: :delete_all
end
schema "itemlists" do
belongs_to :item, Learnit.Item
belongs_to :list, Learnit.List
end
schema "items" do
has_many :itemlists, Learnit.Itemlist
many_to_many :lists, Learnit.List, join_through: Learnit.Itemlist
has_many :memorys, Learnit.Memory
end
schema "memorys" do
belongs_to :membership, Learnit.Membership
belongs_to :item, Learnit.Item
end
我的會員資格的模型
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:user_id, :list_id])
|> validate_required([:user_id, :list_id])
|> cast_assoc(:memorys)
end
我的記憶模型
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:status, :membership_id, :item_id])
|> foreign_key_constraint([:membership_id, :item_id])
|> unique_constraint(:membership_id_item_id)
|> validate_required([:membership_id, :item_id])
end
我嘗試創建新的成員資格並生成與一個查詢相關的記憶。我需要通過列表獲取與會員關聯的第一個項目。然後我的計劃是使用Membership的cast_assoc屬性來保存整個Repo。
如何將這些項目加載到成員變更集中? 項目已經正確加載,我得到一個Map.put/4不定......
def create(conn, %{"membership" => membership_params}) do
memories = %{}
list =
List
|> Repo.get!(membership_params["list_id"])
|> Repo.preload(:items)
|> Map.get(:items) # Get the list of items
|> Enum.map(&load_items(&1, memories)) # Loop through the list to get each item
IO.inspect(memories)
Map.put(membership_params, :memorys, memories)
membership_with_memories = Membership.changeset(%Membership{}, membership_params)
case Repo.insert(membership_with_memories) do
{:ok, _} ->
conn
|> put_flash(:info, "Membership created successfully.")
|> redirect(to: list_path(conn, :index))
{:error, membership_with_memories} ->
Logger.debug("Membership : failed to save membership")
conn
|> put_flash(:alert, "Membership was not created.")
|> redirect(to: topic_path(conn, :index))
end
end
defp load_items(item, memories) do
item
|> Map.put(memories, :item, item) # Add item to the hash
end