shahryarjb
How to get struct in array
Hello, how do I get struct in array ? please see my pic :
I need to get the struct’s params , like this : a.cms_post.title
My output is :
[
%TrangellCmsService.Cms.Db.Post{
__meta__: #Ecto.Schema.Metadata<:loaded, "cms_post">,
changelog: true,
changelog_category: "/ss/ppos",
cms_post_category: #Ecto.Association.NotLoaded<association :cms_post_category is not loaded>,
cms_post_category_id: "960c30f2-183e-4430-a96d-4f0fd41fe37b",
description: "test test test test test test tetststststss tskkkstest of test fo test of test more test more test for test for test tes",
discourse: true,
discourse_link: "/ss/ppos",
download_ext_link: "/ss/ppos",
group_acl: "admin",
id: 6,
inserted_at: ~N[2018-04-29 11:45:05.311436],
learn: true,
learn_category: "/ss/ppos",
pic_x1_link: "/ss/ppos",
pic_x2_link: "/ss/ppos",
pic_x3_link: "/ss/ppos",
plugin: true,
plugin_category: "/ss/ppos",
post_type: "free",
price: "30000",
screen_shot: false,
screen_shot_category: "/ss/ppos",
seo_alias_link: "7seo-why-seo",
seo_description: "for the test for test for test for test tete of test",
seo_language: "fa",
seo_language_link: "/ss/ppos",
seo_tag: "test,test,test,test",
seo_words: "test,test,test,test",
status: true,
title: "shahryar",
updated_at: ~N[2018-04-29 11:45:05.311884]
}
]
Marked As Solved
Eiji
@shahryarjb: I assumed you want to fetch online titles. If so then easier is to call specific query.
defmodule Example do
import Ecto.Query
# aliases for Post and PostCategory here
def sample(seo_alias_link, group_acl) do
query =
from(
post_category in PostCategory,
join: post in assoc(post_category, :cms_post)
order_by: post_category.inserted_at,
limit: 10,
preload: [cms_post: post],
where: p.seo_alias_link == ^seo_alias_link
)
if group_acl == "admin" do
query
else
where(
query,
[post_category, post],
post_category.group_acl == ^group_acl and post.group_acl == ^group_acl
)
end
query
|> Repo.all()
|> Enum.map(& &1.cms_post)
|> List.flatten()
|> Enum.map(& &1.title)
end
end
Example.sample("jsjsjs", "admin")
Also Liked
peerreynders
Something like
Enum.map(a.cms_post, &(Map.get(&1,:title)))
would return a list of title values
a.cms_post
|> hd()
|> Map.get(:title)
returns the title of the post in the head of the list
def get_title([%TrangellCmsService.Cms.Db.Post{title: title}|_]),
do: title
i.e. using pattern matching for destructuring rather than dot notation.
NobbZ
Not array, it is a linked list, and you can use the usual iteration functions from the Enum module.
You can not directly acces the fields because it’s ambiguous which of the potentially many lists contents you want to access.
Eiji
@shahryarjb If I understand you correctly then this code should help you:
categories # here you have root list from your gist
|> Enum.find(& &1.seo_alias_link == "jsjsjs") # here you have list element
|> Map.fetch!(:cms_post) # here you are fetching sub-list from element
|> Enum.map(& &1.title) # finally here you are getting title for all elements
Eiji
@shahryarjb: Sorry, but I don’t know few things:
- What’s value of
category_aliasvariable -"jsjsjs"? - What’s value of
group_aclvariable - root list from gist ? -
fetch_posts_by_category_aliasfunction body
If I assumed correctly (about your variables) then:
def load_posts_by_category_alias(category_alias, group_acl) do
group_acl
|> Enum.find(& &1.seo_alias_link == category_alias)
|> Map.fetch!(:cms_post)
|> Enum.map(& &1.title)
end
Eiji
@shahryarjb: Then it’s really simple. Assuming you want only list of titles:
defmodule Example do
import Ecto.Query
# aliases for Post and PostCategory here
def sample(seo_alias_link, group_acl) do
query =
from(
post_category in PostCategory,
inner_join: post in assoc(post_category, :cms_post),
order_by: post_category.inserted_at,
limit: 10,
select: post.title,
where: p.seo_alias_link == ^seo_alias_link
)
if group_acl == "admin" do
query
else
where(
query,
[post_category, post],
post_category.group_acl == ^group_acl and post.group_acl == ^group_acl
)
end
end
end
"jsjsjs" |> Example.sample("admin") |> Repo.all








