كيف أقوم بعلاقات الانضمام الذاتي الانعكاسية في ActiveRecord؟

StackOverflow https://stackoverflow.com/questions/1034411

سؤال

أحاول تنفيذ نموذج صداقة بأسلوب الشبكات الاجتماعية ولم يحالفني الحظ كثيرًا في محاولة اكتشاف المكونات الإضافية المتوفرة هناك.أعتقد أنني سأتعلم ريلز بشكل أفضل إذا قمت بذلك بنفسي.إذن هذا ما لدي:

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
هل كانت مفيدة؟

المحلول

أنا مندهش من عدم إشارة أحد إلى ما قام به رايان بيتس مؤخرًا تسجيل الشاشة على الموضوع :)

أتمنى أن يساعدك هذا!.

مقتبس من ريان...يتطلب ارتباطًا ذاتيًا مرجعيًا في نموذج المستخدم لتحديد الأصدقاء/المتابعين

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top