رابطه از طریق through

فرض کنید با دو مدل زیر می تونید روابط رو پیدا کنید
user.model
user has_many :order
user has_many :payment through: :order

order model
belongs_to :user
has_one :payment

payment model
belongs_to :order

-------------------- روش دوم --------------------------
user model
has_many :order
has_many :payment

order model
belongs_to :user
has_one :payment

payment model
belongs_to :user
belongs_to :order


وقتی ما بخواییم کلیه ی پرداخت های یوزر رو ببینیم payments = User.find(@id).payments کدوم روش بهینه تر هست ؟ آیا ما توی بانک اطلاعاتی در جدول پرداختی ها برای یوزر قرار بدیم و به عنوان کلید خارجی با جدول یوزر در ارتباط باشه یا اینکه از طریق متد :trough کوئری بگیریم . :trough وقتی ریلشن چند به چند داریم کويری گرفتن رو خیلی راحت می کنه اما اینجا چطور ؟

روش دوم بهتره چون ریلشن چند به چند نیست و through اینجا خواننده code و گمراه میکنه
belongs_to ، has_many ساده تر هستند و بهتر

1 پسندیده

منم با روش ساده تر موافقم، اما نكته اى كه بيشتر نظرم رو جلب كرده عدم رعايت كانوشن ها در code هاى بالاست،
كه ميتونه اشكالات زيادى ايجاد كنه، وقتى ميگيم has_many، بايد object ها جمع (plural)باشند و وقتى از belongs_to يا has_one استفاده ميكنيم بايد Object مورد نظر فرد (singular) باشه
has_many: :payments
has_many: :orders

1 پسندیده

سوال در مورد چیز دیگری است . در مورد S جمع درست میگید ولی اون مشکل من نیست

ممنون از جوابت

من خوانا بودن کد برام اهمیتی نداره ، هر چند که through به نظرم کد رو خوانا تر می کنه . چیزی که برام مهمه پرفورمانس سایت هست . سرعت واکشی ها و بهینه بودن دیتا بیس
با توجه به این مسٔله کدوم مورد رو انتخاب می کنید.

پرفورمنس هردو یکی هست پرفورمنس اینجا بیشتر از طرز query کردن و index میاد
خواهش می کنم

چون کد برای من ناخوانا بود عرض کردم. خوانا بودن کد گاهی از کارکرد کد مهمتره.

متد to_sql میتونه کمک کنه که در ترمینال ببینید چه اتفاقی در زمینه query ها رخ میده