نحوه رلیشن زدن تو در تو در الکسیر ecto

درود خدمت دوستان گرامی امروز یک مورد مسخره برام پیش اومده :grin: هرچی سرچ می کنم به پست هایی می رسم که مثلا می گه چطور بین سه جداول مثلا رلیشن بزنیم همون استفاده چند join در ecto مثل مورد زیر

		def get_user_profile_actions_with_token_actions(id, count, order) do
			query = from p in UsersInfo,
			join: c in TokenActions, on: p.id == c.users_info_id,
			join: d in ProfileActions, on: p.id == d.users_info_id,
			limit: ^count,
			select: %{
				name: p.name,
				old_email: d.old_email,
				token_action_type: c.token_action_type
			}

			Repo.all(query)
		end

ولی اصلا منظور من این نیست

لطفا به تصویر زیر توجه فرمایید

شما فرض کنید

۱. من یک مجموعه دارم
۲. حالا ۱۰ سرفصل در این مجموعه داریم
۳. هر سرفصلی باز داخلش ۵ الی ۱۰ پست داره یا بیشتر کمتر

در تصویر بالا مربع قرمز مجموعه -> سرفصل ها سمت چپ -> پست ها سمت راست

با این موارد من دقیقا گیج شدم چطور از میگریشن شروع کنم هر جدولی از آخر به جدول قبلش ارتباط داره یعنی ۳ به دو و دو به یک و نحوه کو اری زدنش در Ecto

پست یک جوری نمی تونم حتی به انگلیسی برگردونمش :sweat_smile:

سلام اسمه جدول ها با سطرهاش بده

1 پسندیده

درود سام عزیز .
اسم جداول حالا بدون آندرلاین به صورت زیر هست

learn category
learn headlines
learn post

در مورد فیلد هاش سام عزیز می شه چند مورد تست بزارید من اضافه کنم . چون فکر کنم چندتا کم زیاد باید بکنم

ولی همشون تیتر - آیدی رو دارند با دیسکریپشن
ممنونم

سام عزیز پست ویرایش کردم .

دو روش داری همرو با join با یک query برگردونی
روش دوم تمامه category هارو بگیری بعد وقتی روی هر category کلیک شد باقی داده برای category لود کنی

1 پسندیده
SELECT * FROM posts
JOIN headlines ON headlines.id = posts.headline_id
JOIN categories ON categories.id = posts.category_id // ya headlines.category_id
where user_id = "some_id"
1 پسندیده

سام عزیز اینجوری شما فرمودید باشه فکر کنم می شه با ECto هم زد درسته ؟

فقط چیجوری باید در ساخت میگریشن چی رو به چی رفرنس کنم و در فایل schema چی رو به چی has_many کنم ؟
اونجا به چه صورت هست ؟

post has_many categories
post has many headlines

1 پسندیده

ممنون سام عزیز من این رو دوباره انجام می دم . کدمو اینجا می زارم ممنونم ازت.

1 پسندیده

https://hexdocs.pm/ecto/associations.html

1 پسندیده

با درود خدمت دوستان . گفتم شاید این لینک زیر بدرد کسانی که در حال یادگیری الکسیر هستند بخوره

مشکل من از جایی شروع شد که سعی می کردم

query = from u in "cms",
          select: u
			Repo.all(query)

بیام در select بجای اینکه تک تک فیلد هارو دوباره بنویسم یک u بزارم و به صورت داینامیک بیاره ولی دیدم اروری در ترمینال می ده

** (Ecto.QueryError) PostgreSQL does not support selecting all fields from "cms" without a schema. Please specify a schema or specify exactly which fields you want to select in query:

خوب در اون پست چندین راه حل گفته که بدردتون می خوره ولی در کل برای خود من دوست داشتنی نبود چون باز باید همه رو بنویسیم :grin:

من خودم آخر مورد زیر رو انتخاب کردم

	query = from u in "cms",
          select: %{title: u.title, status: u.status}
			Repo.all(query)

مطلب مورد بالا

درود من یک مشکلی پیدا نکردم با join خنده داره . احتمالا جایی دارم اشتباه کوچیکی می کنم

به کد زیر نگاه کنید

post = from p in Post,
            join: c in PostCategory,
					 select: %{
						 title: p.title,
						 status: p.status,
						 post_type: p.post_type,
				

						 category_title: c.title,
						 category_status: c.status,
						 category_language: c.language,
				
					 }
		Repo.all(post)

مثلا من اگر سه مجموعه و دو پست داشته باشم برای من هر پست ۳ بار چاپ می کند . یعنی ۶ بار خروجی می دهد . جالبه چرا اینکارو می کنه.

دوستان نظری دارند ؟

چه اشتباهی کردم :grin: نیومدم where تنظیم کنم