Hi, I have a nested preload which I need to convert to a json in my controller and I used @drive in my schema file, but when I call it, it shows me this error:
** (FunctionClauseError) no function clause matching in Jason.Encoder.Joboffer.Admin.Consulting.ConsultingCategorySchema.encode/2
The following arguments were given to Jason.Encoder.Joboffer.Admin.Consulting.ConsultingCategorySchema.encode/2:
elixir: v1.11.1
phoenix: 1.5.6
mac the last version
my schema file:
defmodule Joboffer.Admin.Consulting.ConsultingCategorySchema do
use Ecto.Schema
# @derive {Jason.Encoder, only: [:id, :title, :short_description, :description, :image, :alias_link, :consulting_category_id]}
@derive {Jason.Encoder, only: [:name, :short_description]}
import Ecto.Changeset
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "consulting_categories" do
field :title, :string, size: 150, null: false
field :short_description, :string, size: 164, null: true
field :description, :string, null: true
field :image, :string, size: 200, null: true
field :alias_link, :string, size: 200, null: false
field :status, :boolean, null: false
has_many :consulting_headlines, Joboffer.Admin.Consulting.ConsultingHeadlineSchema, foreign_key: :consulting_category_id, on_delete: :nothing
has_many :consulting_answers, Joboffer.Admin.Consulting.ConsultingAnswerSchema, foreign_key: :consulting_category_id, on_delete: :nothing
timestamps()
end
@all_fields ~w(title short_description description image alias_link status)a
@all_required ~w(title alias_link status)a
def changeset(struct, params \\ %{}) do
struct
|> cast(params, @all_fields)
|> validate_required(@all_required, message: "فیلد مذکور نمی تواند خالی باشد.")
|> validate_length(:title, min: 3, max: 150, message: "حداکثر کاراکتر در تیتر مجموعه ۱۵۰ و حداقل ۳ کاراکتر می باشد.")
|> validate_length(:short_description, min: 3, max: 164, message: "حداکثر کاراکتر در توضیحات کوتاه مجموعه 164 و حداقل ۳ کاراکتر می باشد.")
|> validate_length(:image, min: 3, max: 200, message: "حداکثر کاراکتر در تصویر مجموعه 200 و حداقل ۳ کاراکتر می باشد.")
|> validate_length(:alias_link, max: 200, message: "حداکثر ۲۰۰ کاراکتر")
end
end
##full terminal error:
** (FunctionClauseError) no function clause matching in Jason.Encoder.Joboffer.Admin.Consulting.ConsultingCategorySchema.encode/2
The following arguments were given to Jason.Encoder.Joboffer.Admin.Consulting.ConsultingCategorySchema.encode/2:
# 1
%Joboffer.Admin.Consulting.ConsultingCategorySchema{
__meta__: #Ecto.Schema.Metadata<:loaded, "consulting_categories">,
alias_link: "شهروندی",
consulting_answers: #Ecto.Association.NotLoaded<association :consulting_answers is not loaded>,
consulting_headlines: [
%Joboffer.Admin.Consulting.ConsultingHeadlineSchema{
__meta__: #Ecto.Schema.Metadata<:loaded, "consulting_headlines">,
consulting_categories: #Ecto.Association.NotLoaded<association :consulting_categories is not loaded>,
consulting_category_id: "8846e216-3f2c-46f1-b404-cebcc6fadb5f",
consulting_options: [
%Joboffer.Admin.Consulting.ConsultingOptionsSchema{
__meta__: #Ecto.Schema.Metadata<:loaded, "consulting_options">,
consulting_headline_id: "2d5ff0ea-b109-4147-9e07-223ddf9e63b5",
consulting_headlines: #Ecto.Association.NotLoaded<association :consulting_headlines is not loaded>,
id: "85827aa6-07fe-4aa1-9375-bc51c4a124f4",
inserted_at: ~N[2020-10-25 16:01:39],
question: "سوال بعد از اشکال چیست ؟",
score: 12,
status: true,
updated_at: ~N[2020-10-25 17:20:54]
},
%Joboffer.Admin.Consulting.ConsultingOptionsSchema{
__meta__: #Ecto.Schema.Metadata<:loaded, "consulting_options">,
consulting_headline_id: "2d5ff0ea-b109-4147-9e07-223ddf9e63b5",
consulting_headlines: #Ecto.Association.NotLoaded<association :consulting_headlines is not loaded>,
id: "6c924163-d987-4746-ab7b-b3f56354e99e",
inserted_at: ~N[2020-10-25 17:21:31],
question: "دیدن شدن به وسیله دشمن چیست؟",
score: 98,
status: true,
updated_at: ~N[2020-10-25 17:21:31]
}
],
id: "2d5ff0ea-b109-4147-9e07-223ddf9e63b5",
inserted_at: ~N[2020-10-25 13:26:04],
short_description: "این سوال به ما کمک می کند که رابطه بهتری برای امتیاز دهی شما پیدا کنیم",
status: true,
title: "شما در چه رنج سنی هستید",
updated_at: ~N[2020-10-25 13:26:04]
}
],
description: "<p class=\"card-text\">در این بخش شما می توانید برای هر دسته از سوالات خودتان یک مجموعه بسازید و به واسطه دکمه سرفصل برای هر مجموعه سرفصلی را ایجاد کنید.</p>\r\n<p class=\"card-text\">در این بخش شما می توانید برای هر دسته از سوالات خودتان یک مجموعه بسازید و به واسطه دکمه سرفصل برای هر مجموعه سرفصلی را ایجاد کنید.</p>\r\n<p class=\"card-text\">در این بخش شما می توانید برای هر دسته از سوالات خودتان یک مجموعه بسازید و به واسطه دکمه سرفصل برای هر مجموعه سرفصلی را ایجاد کنید.</p>\r\n<p class=\"card-text\">در این بخش شما می توانید برای هر دسته از سوالات خودتان یک مجموعه بسازید و به واسطه دکمه سرفصل برای هر مجموعه سرفصلی را ایجاد کنید.</p>\r\n<p class=\"card-text\">در این بخش شما می توانید برای هر دسته از سوالات خودتان یک مجموعه بسازید و به واسطه دکمه سرفصل برای هر مجموعه سرفصلی را ایجاد کنید.</p>\r\n<p class=\"card-text\">در این بخش شما می توانید برای هر دسته از سوالات خودتان یک مجموعه بسازید و به واسطه دکمه سرفصل برای هر مجموعه سرفصلی را ایجاد کنید.</p>",
id: "8846e216-3f2c-46f1-b404-cebcc6fadb5f",
image: "https://trangell.com/dl/cms-content/special/asan-pardakht.jpg",
inserted_at: ~N[2020-10-25 10:38:24],
short_description: "در این بخش شما می توانید برای هر دسته از سوالات خودتان یک مجموعه بسازید و به واسطه دکمه سرفصل برای هر مجموعه سرفصلی را ایجاد کنید.",
status: true,
title: "آزمون ساختار شهروندی",
updated_at: ~N[2020-10-25 10:38:24]
}
# 2
{#Function<3.48815102/3 in Jason.Encode."-fun.escape_json/3-">,
#Function<1.48815102/3 in Jason.Encode."-fun.map_naive/3-">}
Attempted function clauses (showing 1 out of 1):
def encode(%{name: name, short_description: short_description}, {escape, encode_map})
(joboffer 0.1.0) lib/joboffer/admin/consulting/consulting_category_schema.ex:13: Jason.Encoder.Joboffer.Admin.Consulting.ConsultingCategorySchema.encode/2
(jason 1.2.2) lib/encode.ex:143: Jason.Encode.list/3
(jason 1.2.2) lib/encode.ex:35: Jason.Encode.encode/2
(jason 1.2.2) lib/jason.ex:125: Jason.encode/2
my controller:
def category(conn, %{"id" => category_id}) do
conn
|> put_status(200)
|> json(%{categories: Consulting.show_category(category_id)})
end
my query
def show_category(category_id) do
query = from u in ConsultingCategorySchema,
where: u.id == ^category_id,
where: u.status == true,
order_by: [desc: u.inserted_at],
left_join: c in assoc(u, :consulting_headlines),
where: c.status == true,
order_by: [asc: c.inserted_at],
left_join: j in assoc(c, :consulting_options),
where: j.status == true,
order_by: [asc: j.inserted_at],
preload: [consulting_headlines: {c, consulting_options: j}]
Repo.all(query)
end