Двунаправленные самоссылочные ассоциации - PullRequest
4 голосов
/ 27 мая 2010

Взяв асьикаста Райана Бейтса в качестве примера: http://asciicasts.com/episodes/163-self-referential-association

Он заканчивается двумя ассоциациями пользователя

  • : Друзья
  • : inverse_friends

Учитывая, что пользователю было бы все равно, кто спровоцировал дружбу, вы бы хотели, чтобы ассоциация пользователей была просто

  • : Друзья

, который состоял из обоих отношений. Т.е. отношения, спровоцированные пользователем, и отношения, спровоцированные другом пользователя.

Итак, как вы можете достичь этой двунаправленной само-ссылочной ассоциации?

ОБНОВЛЕНИЕ - У Джоша Сусера есть пост об этом здесь: http://blog.hasmanythrough.com/2006/4/21/self-referential-through

Тем не менее, он по-прежнему говорит о has_many: sources и has_many: приемниках, когда действительно должны быть узлы has_many:, которые включают как источники, так и приемники.

1 Ответ

8 голосов
/ 27 мая 2010

посмотреть, если это работает для вас?

class User < ActiveRecord::Base
  has_many :friendships, :foreign_key => "person_id", :class_name => "Friendship"
  has_many :friends, :through => :friendships

  def befriend(user)
    # TODO: put in check that association does not exist
    self.friends << user
    user.friends << self
  end
end

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

# Usage
jack = User.find_by_first_name("Jack")
jill = User.find_by_first_name("Jill")

jack.befriend(jill)

jack.friends.each do |friend|
  puts friend.first_name
end
# => Jill

jill.friends.each do |friend|
  puts friend.first_name
end
# => Jack

это дана схема таблицы базы данных

users
  - id
  - first_name
  - etc...

friendships
  - id
  - person_id
  - friend_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...