Как структурировать рельсы модели дружбы пользователей? - PullRequest
1 голос
/ 16 октября 2011

Мне нужно создать модель пользователя Friendship (user1_id, user2_id), которая соединяет пользователей.

Я бы хотел избежать создания двух Friendship записей для каждого пользователя / друга, так как дружба идет в обе стороны.

Как бы вы это сделали, имея несколько простых

# User.rb
has_many :friendships
has_many :friends, :through => :friendships, :class_name => "User"

EDIT Мое решение состояло в том, чтобы отразить записи:

class Friendship < ActiveRecord::Base
    belongs_to :user1
    belongs_to :user2

    after_create :create_mirror!
    after_destroy :destroy_mirror!

    validate :does_not_exist

    def mirror_record
      Friendship.where(:user1_id => user2.id, :user2_id => user1.id).first
    end

    private

    def does_not_exist
      errors.add(:base, 'already exists') if Friendship.where(:user1_id => user1.id, :user2_id => user2.id) rescue nil
    end

    def create_mirror!
      Friendship.create(:user1 => user2, :user2 => user1)
    end

    def destroy_mirror!
      mirror_record.destroy if mirror_record
    end
end

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

Может быть, этот фрагмент кода сработает или даст вам некоторое вдохновение. Это из amistad драгоценного камня.

class User
  has_many :friendships
  has_many :invited, :through => :friendships, :source => :friend
  has_many :invited_by, :through => :inverse_friendships, :source => :user

  def friends
    self.invited + self.invited_by
  end

class Friendships
  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"

Таким образом, в ваших контроллерах вы можете написать что-то вроде user.friends, чтобы выбрать всех друзей.

0 голосов
/ 16 октября 2011

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

class Friendship
  belongs_to user1, :class_name => "User"
  belongs_to user2, :class_name => "User"

... и ваша таблица ...

friendship_id | user1_id | user2_id
-----------------------------------

В Rails 2.x это называлось отношением "имеет и принадлежит многим" (HABTM).

Я считаю, что вам необходимо явно указывать имена классов для каждого из операторов belongs_to, поскольку они оба указывают на один и тот же типродительской записи (a User), и поэтому вы не можете назвать оба поля user - вы должны как-то различать их по имени.

...