كيف أقوم بعلاقات الانضمام الذاتي الانعكاسية في ActiveRecord؟
-
06-07-2019 - |
سؤال
أحاول تنفيذ نموذج صداقة بأسلوب الشبكات الاجتماعية ولم يحالفني الحظ كثيرًا في محاولة اكتشاف المكونات الإضافية المتوفرة هناك.أعتقد أنني سأتعلم ريلز بشكل أفضل إذا قمت بذلك بنفسي.إذن هذا ما لدي:
class User < ActiveRecord::Base
has_many :invitee_friendships ,
:foreign_key => :friend_id,
:class_name => 'Friendship'
has_many :inviter_friends,
:through => :invitee_friendships
has_many :inviter_friendships ,
:foreign_key => :user_id,
:class_name => 'Friendship'
has_many :invited_friends,
:through => :inviter_friendships
end
class Friendship < ActiveRecord::Base
belongs_to :user
//I think something needs to come here, i dont know what
end
في irb
عندما أحاول هذا:
friend1 = Friend.create(:name => 'Jack')
friend2 = Friend.create(:name => 'John')
bff = Friendship.create(:user_id =>1, :friend_id => 2)
f1.invited_friends
أحصل على خطأ:
ActiveRecord::HasManyThroughSourceAssociationNotFoundError:
Could not find the source
association(s) :invited_friend or
:invited_friends in model Friendship.
Try 'has_many :invited_friends,
:through => :invited_friendships,
:source => <name>'. Is it one of
:user?
شرح نظام الصداقة:
- يمكن للمستخدم دعوة مستخدمين آخرين ليصبحوا أصدقاء.
- يتم تمثيل المستخدمين الذين قمت بدعوتهم ليصبحوا أصدقاء
invited_friends
. - يتم تمثيل المستخدمين الذين قاموا بدعوتك لتصبح أصدقاء
inviter_friends
. - يتم تمثيل إجمالي قائمة الأصدقاء الخاصة بك بواسطة
invited_friends
+inviter_friends
.
مخطط
table Friendship
t.integer :user_id
t.integer :friend_id
t.boolean :invite_accepted
t.timestamps
table User
t.string :name
t.string :description
المحلول
أنا مندهش من عدم إشارة أحد إلى ما قام به رايان بيتس مؤخرًا تسجيل الشاشة على الموضوع :)
أتمنى أن يساعدك هذا!.
مقتبس من ريان...يتطلب ارتباطًا ذاتيًا مرجعيًا في نموذج المستخدم لتحديد الأصدقاء/المتابعين
لا تنتمي إلى StackOverflow