У пользователя много пользователей: или я должен использовать другой способ для социальной сети на основе друзей? - PullRequest
2 голосов
/ 15 февраля 2010

Я создаю небольшую социальную сеть в Rails, где люди могут добавлять друг друга в друзья. Я создал модель с именем 'user', которая содержит электронную почту, сильный хэш md5 с солью пароля и т. Д.

Как мне создать что-то вроде опции добавить другого пользователя в друзья? Возможно ли иметь что-то вроде has_many_and_belongs_to :user в пользовательской модели? Таким образом, пользователь имеет много пользователей и принадлежит многим пользователям. Или я должен использовать другой способ, например, добавить модель дружбы, которая имеет user1s_id:integer и user2s_id:integer?

Ответы [ 3 ]

2 голосов
/ 15 февраля 2010

По сути, вам нужна модель объединения, которая объединяет пользователей с пользователями. Но вам придется использовать более описательные термины для Rails.

Twitter не использует Rails, но вот как их пользовательские ассоциации могут работать в Rails, используя терминологию Twitter. Примечание: Twitter не требует двунаправленного следования (то есть, если пользователь следует за другим, это не значит, что второй пользователь следует за первым)

class User < ActiveRecord::Base
  has_many :followings
  has_many :followers, :through => :followings, :class_name => "User"
  has_many :followees, :through => :followings, :class_name => "User"
end


class Following < ActiveRecord::Base 
# fields: follower_id followee_id (person being followed)
  belongs_to :follower, :class_name => "User"
  belongs_to :followee, :class_name => "User"
end

Принудительная двунаправленная дружба (например, Facebook заставляет меня не дружить с вами, если вы не дружите со мной) потребует немного больше работы Вам нужно будет либо управлять ответными записями с помощью обратных вызовов, либо использовать пользовательский искатель SQL. Использование специального средства поиска SQL означает, что ActiveRecord, вероятно, не сможет управлять ассоциациями для вас.

2 голосов
/ 15 февраля 2010

Я бы предложил использовать модель дружбы, потому что в db-случае вам понадобится таблица соединения в любом случае, но если сделать эту таблицу явной, вы сможете хранить более подробную информацию об отношениях (например, «друг» или «семья» дата добавлена, ...)

2 голосов
/ 15 февраля 2010

Я бы предположил, что у пользователя много связей, поэтому вы можете свободно добавлять новые типы отношений в будущем.

Итак, вы начинаете с таблицы отношений «один пользователь к другому пользователю» (как минимум, всего два идентификатора), а затем в будущем вы можете добавить таблицу отношений «один пользователь в группу» (после того, как вы создали группы Конечно!)

...