نحوه select کردن در زمانی که preload نیز در query می باشد

درود خدمت دوستان و اساتید محترم .

یک مشکلی که من پیدا کردم به این صورت هست که نمی توانم خروجی کاملا انتخاب شده در زمانی preload در کواری هست داشته باشم

به عنوان مثال به قطعه کد زیر نگاه کنید :

	def get_cms_post_and_category_name(id) do
		Repo.all from p in Post,
           join: c in assoc(p, :cms_post_category),
           where: p.id == ^id,
					 select: {p, c.title},
           preload: [:cms_post_category]
	end

در اینجا به کمک این مطلب تونستم فقط تایتل جدول پریلود شده رو به شکل زیر اضافه کنم . باز با این صورت دارد کل اطلاعات جدول دوم رو هم می آورد

به عنوان مثال نگاه کنید اون free که در آخر نوشته شده اسم جدول من هست که فقط اومده یک طرف به کل کوآری اضافه کرده

 },
     cms_post_category_id: "960c30f2-183e-4430-a96d-4f0fd41fe37b",
    ....
     id: 3,
   ....
     status: false,
     title: "یک مطلب دیدنی",
     updated_at: ~N[2018-04-29 11:36:24.000000]
   }, "free"}

خلاصه بخوام مشکلمو بگم من فقط می خوام تیتر مطلب و تیتر مجموعه اون رو در کو آری بیارم نه هیچ اطلاعات دیگیری . ولی نمی تونم کاستوم کنم و ارور می گیره

لازم به ذکر هست من کارم با کد بالا راه می افته ولی برام سوال هست چرا نمی شه مثلا کاستومایز کرد و همه اطلاعات می یاد بیشتر از اینکه از کنترل من خارجه مشکل دارم باهاش

مثلا به صورت زیر :

	def get_cms_post_and_category_name(id) do
		post = Repo.all from p in Post,
           join: c in assoc(p, :cms_post_category),
           where: p.id == ^id,
					 select: {p, c.title},
           preload: [:cms_post_category]

		case post do
			[] ->
				{:error, :no_data}
			[{one, _two} | _b] ->
				%{category_description: one.cms_post_category.description}
		end
	end

این هم برای ساخت لوپش هم بزارم اگر کسی نیاز داشت بعدا زیاد اذیت نشه من خیلی اذیت شدم تا متوجه شدم چطور می تونم پترنشو در بیارم

	def load_all_posts() do
		# "#{count}"
		 post = Repo.all from p in Post,
           join: c in assoc(p, :cms_post_category),
					 order_by: p.inserted_at,
					 # limit: 1,
					 # select: {p, c.title},
           preload: [cms_post_category: c]


		for %TrangellCmsService.Cms.Db.Post{} = file <- post do
		    %{title: p.title, discourse: p.discourse, category_title: p.cms_post_category.title}
		end
	end

ولی همچنان نتونستم از همون اول در select این کارو انجام بدم و فقط فیلد هایی نظرم خروجی بدم

با تشکر

اینجا یکی راه select کردن گفته

1 پسندیده

درود سام عزیز

post_query = 
  from p in Post,
    where: p.id == ^id,
    join: c in assoc(p, :comments),
    join: u in assoc(c, :user), 
    preload: [comments: {c, user: u}]

این کدش جالب نیست فقط پریلود تو پریلود کرده مثل اینکه تو یک جا بیاد من بیشتر دنبال این بود که بتونم سکلت کامل بکنم

در این کد هم پریلود هم بی خیال شده فکر کنم کلا چون اثری ازش نیست

post_query = 
  from p in Post,
    where: p.id == ^id,
    join: c in assoc(p, :comments),
    join: u in assoc(c, :user), 
    select: %{id: p.id, title: p.title, comments: p.comments, name: u.name}

البته من این نکته رو بگم که من یک کاری کردم این هست که دارم تک پست رو فراخوانی می کنم که اطلاعات مجموعه اونم بیاد یعنی در اصل پست هم که به مجموعه خودش رلیشن شده یا رفرنس شده یا belongs_to هست البته این کارم کامل درست نیست فقط در حد تست هست چون رابطه /// یک به n هستو من با رلیشن باید انجام می دادم نه preload

Join با select کاری که میخواهی و انجام نمیده مثل کد بالا؟

1 پسندیده

سام عزیز ۱۰۰ درصد انجام می ده ولی برام جالب هست شما فکر کنید من برعکس اینکارو بخوام بکنم یعنی موجودیت پریلود برای چی هست ؟

من یک مجموعه دارم می خوام تمام مطالب یک مجموعه رو با پریلود بیارم بالا تا اینجا درسته ؟ این مشکل هست که نمی شه خروجی کنترل شده آورد بیرون البته من مشکلمو حل کردم با قطعه کدی که پست اوله ولی جالب که چرا این همه مشکل دارند ولی این مورد حل نشده تو گیت هابشونم رفتم همه نظرات غیر کاربردی هستند .

سوال اصلی join با پریلود دقیقا چه فرقی می کنه منظورم در آخرین لایه که تبدیل می شه به کوآری برای پست گرس ؟ اصلا فرقی می کنه برای پستگرس؟

preload داده های association ها رو در struct تعریف شده برای struct برمیگردونه
و query که به پستگرس میده یک کم فرق میکنه تمامه فیلد هارو select میکنه
join خالی فقط join میکنه

1 پسندیده

سام عزیز با این توضیحاتی که فرمودید من فکر می کنم سرعت join خالی بیشتر از پریلود باشه درسته ؟ چون حتی join هم بشه بازم باید فیلد های مورد نظر رو دستی سلکت کرد و نمایش داد.

1 پسندیده

بله چون تعداد فیلد کمتری بدونه پرلود برمیگرده

1 پسندیده