Создание ненаправленной самореферентной ассоциации в рельсах3 - PullRequest
2 голосов
/ 21 января 2011

Я создаю приложение rails3, которое будет включать возможность добавления других пользователей в друзья. Эти отношения должны вести себя как друзья на Facebook, где дружба должна быть взаимной, а не дружбой в Твиттере, когда пользователи могут дружить с другим пользователем без взаимности. Я не знаю, как это сделать без создания двух отдельных отношений между двумя пользователями. Вот что у меня есть:

class User < ActiveRecord::Base
  has_many :friendships
  has_many :friends, :through => :friendships
end

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
end 

Чтобы создать дружбу, я звоню:

@user1.friends << @user2

Однако это создает отношения только в одном направлении. @ user2.friends все еще пуст. Единственный способ, которым я знаю, как заставить это работать прямо сейчас, это просто позвонить:

@user1.friends << @user2
@user2.friends << @user1

Ответы [ 2 ]

1 голос
/ 25 января 2011

Посмотрите, поможет ли это руководство:

http://asciicasts.com/episodes/163-self-referential-association

В частности, раздел «Обратные отношения»:

«При создании ссылочных отношений важно помнить, чтомы только создаем одну сторону отношений ... Нам нужны две записи Дружбы, чтобы создать взаимную дружбу. "

class User < ActiveRecord::Base   

  has_many :friendships   
  has_many :friends, :through => :friendships   

  has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"   
  has_many :inverse_friends, :through => :inverse_friendships, :source => :user   

  #rest of class omitted. 
end
0 голосов
/ 25 января 2011

Может быть, вы должны использовать before_save_collection_association обратный вызов?Это даст вам некоторые дополнительные способности.

...