के लिए एक JSON मानचित्र बनाना मैं इस तरह के रूप में एक Ecto मॉडल है:एक स्वयं को संदर्भित Ecto मॉडल
defmodule Project.Category do
use Project.Web, :model
schema "categories" do
field :name, :string
field :list_order, :integer
field :parent_id, :integer
belongs_to :menu, Project.Menu
has_many :subcategories, Project.Category, foreign_key: :parent_id
timestamps
end
@required_fields ~w(name list_order)
@optional_fields ~w(menu_id parent_id)
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
आप देख श्रेणी मॉडल उपश्रेणियाँ परमाणु के माध्यम से ही संदर्भित कर सकते हैं कर सकते हैं।
यहाँ इस मॉडल से संबद्ध दृश्य है:
defmodule Project.CategoryView do
use Project.Web, :view
def render("show.json", %{category: category}) do
json = %{
id: category.id,
name: category.name,
list_order: category.list_order
parent_id: category.parent_id
}
if is_list(category.subcategories) do
children = render_many(category.subcategories, Project.CategoryView, "show.json")
Map.put(json, :subcategories, children)
else
json
end
end
end
ताकि मैं ज़हर के साथ अच्छा खेल सकते हैं, जब वे पहले से लोड नहीं कर रहे हैं मैं एक यदि उपश्रेणियाँ पर शर्त है।
अंत में, यहाँ मेरी 2 नियंत्रक कार्यों कि इस दृष्टिकोण को लागू कर रहे हैं:
defmodule Project.CategoryController do
use Project.Web, :controller
alias Project.Category
def show(conn, %{"id" => id}) do
category = Repo.get!(Category, id)
render conn, "show.json", category: category
end
def showWithChildren(conn, %{"id" => id}) do
category = Repo.get!(Category, id)
|> Repo.preload [:subcategories, subcategories: :subcategories]
render conn, "show.json", category: category
end
end
show
समारोह ठीक काम करता है:
{
"parent_id": null,
"name": "a",
"list_order": 4,
"id": 7
}
लेकिन, मेरा showWithChildren
समारोह घोंसले की वजह से 2 स्तर तक ही सीमित है मैं प्रीलोडिंग का उपयोग कैसे करता हूं:
{
"subcategories": [
{
"subcategories": [
{
"parent_id": 10,
"name": "d",
"list_order": 4,
"id": 11
}
],
"parent_id": 7,
"name": "c",
"list_order": 4,
"id": 10
},
{
"subcategories": [],
"parent_id": 7,
"name": "b",
"list_order": 9,
"id": 13
}
],
"parent_id": null,
"name": "a",
"list_order": 4,
"id": 7
}
उदाहरण के लिए, उपरोक्त श्रेणी आइटम 11 में उपश्रेणियां भी हैं लेकिन मैं उन तक पहुंचने में असमर्थ हूं। उन उपश्रेणियों में उपश्रेणियां भी हो सकती हैं, इसलिए पदानुक्रम की संभावित गहराई एन है।
मुझे पता है कि मुझे कुछ रिकर्सिव जादू की आवश्यकता है, लेकिन चूंकि मैं कार्यात्मक प्रोग्रामिंग और एलिक्सीर दोनों के लिए नया हूं, इसलिए मैं अपने सिर को इसके चारों ओर लपेट नहीं सकता। कोई भी मदद बहुत ही सराहनीय होगी।
अद्भुत काम करता है। :) यह उल्लेखनीय है कि परियोजना के रेपो को उपनाम के रूप में जोड़ा जाना चाहिए, क्योंकि दृश्य में उन्हें डिफ़ॉल्ट रूप से नहीं है। मैं आवेदन के बजाए डीबी पक्ष पर इसकी देखभाल करने के लिए देखता हूं। धन्यवाद! – user1112789
@ जोस-वैलीम इस समस्या के लिए एक सुंदर विकल्प है? – user2290820